@iskra-ui/react 0.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 (97) hide show
  1. package/LICENCE.md +79 -0
  2. package/dist/components/Alert/Alert.d.ts +18 -0
  3. package/dist/components/Alert/Alert.d.ts.map +1 -0
  4. package/dist/components/Alert/index.d.ts +3 -0
  5. package/dist/components/Alert/index.d.ts.map +1 -0
  6. package/dist/components/Avatar/Avatar.d.ts +16 -0
  7. package/dist/components/Avatar/Avatar.d.ts.map +1 -0
  8. package/dist/components/Avatar/index.d.ts +3 -0
  9. package/dist/components/Avatar/index.d.ts.map +1 -0
  10. package/dist/components/Badge/Badge.d.ts +21 -0
  11. package/dist/components/Badge/Badge.d.ts.map +1 -0
  12. package/dist/components/Badge/index.d.ts +3 -0
  13. package/dist/components/Badge/index.d.ts.map +1 -0
  14. package/dist/components/Button/Button.d.ts +26 -0
  15. package/dist/components/Button/Button.d.ts.map +1 -0
  16. package/dist/components/Button/index.d.ts +3 -0
  17. package/dist/components/Button/index.d.ts.map +1 -0
  18. package/dist/components/Card/Card.d.ts +21 -0
  19. package/dist/components/Card/Card.d.ts.map +1 -0
  20. package/dist/components/Card/index.d.ts +3 -0
  21. package/dist/components/Card/index.d.ts.map +1 -0
  22. package/dist/components/Checkbox/Checkbox.d.ts +12 -0
  23. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -0
  24. package/dist/components/Checkbox/index.d.ts +3 -0
  25. package/dist/components/Checkbox/index.d.ts.map +1 -0
  26. package/dist/components/EmptyState/EmptyState.d.ts +12 -0
  27. package/dist/components/EmptyState/EmptyState.d.ts.map +1 -0
  28. package/dist/components/EmptyState/index.d.ts +3 -0
  29. package/dist/components/EmptyState/index.d.ts.map +1 -0
  30. package/dist/components/FormField/FormField.d.ts +27 -0
  31. package/dist/components/FormField/FormField.d.ts.map +1 -0
  32. package/dist/components/FormField/index.d.ts +3 -0
  33. package/dist/components/FormField/index.d.ts.map +1 -0
  34. package/dist/components/Icon/Icon.d.ts +21 -0
  35. package/dist/components/Icon/Icon.d.ts.map +1 -0
  36. package/dist/components/Icon/index.d.ts +3 -0
  37. package/dist/components/Icon/index.d.ts.map +1 -0
  38. package/dist/components/IconButton/IconButton.d.ts +11 -0
  39. package/dist/components/IconButton/IconButton.d.ts.map +1 -0
  40. package/dist/components/IconButton/index.d.ts +3 -0
  41. package/dist/components/IconButton/index.d.ts.map +1 -0
  42. package/dist/components/Modal/Modal.d.ts +24 -0
  43. package/dist/components/Modal/Modal.d.ts.map +1 -0
  44. package/dist/components/Modal/index.d.ts +3 -0
  45. package/dist/components/Modal/index.d.ts.map +1 -0
  46. package/dist/components/Radio/Radio.d.ts +32 -0
  47. package/dist/components/Radio/Radio.d.ts.map +1 -0
  48. package/dist/components/Radio/index.d.ts +3 -0
  49. package/dist/components/Radio/index.d.ts.map +1 -0
  50. package/dist/components/Sidebar/Sidebar.d.ts +23 -0
  51. package/dist/components/Sidebar/Sidebar.d.ts.map +1 -0
  52. package/dist/components/Sidebar/index.d.ts +3 -0
  53. package/dist/components/Sidebar/index.d.ts.map +1 -0
  54. package/dist/components/Skeleton/Skeleton.d.ts +14 -0
  55. package/dist/components/Skeleton/Skeleton.d.ts.map +1 -0
  56. package/dist/components/Skeleton/index.d.ts +3 -0
  57. package/dist/components/Skeleton/index.d.ts.map +1 -0
  58. package/dist/components/Spinner/Spinner.d.ts +11 -0
  59. package/dist/components/Spinner/Spinner.d.ts.map +1 -0
  60. package/dist/components/Spinner/index.d.ts +3 -0
  61. package/dist/components/Spinner/index.d.ts.map +1 -0
  62. package/dist/components/Switch/Switch.d.ts +11 -0
  63. package/dist/components/Switch/Switch.d.ts.map +1 -0
  64. package/dist/components/Switch/index.d.ts +3 -0
  65. package/dist/components/Switch/index.d.ts.map +1 -0
  66. package/dist/components/Table/Table.d.ts +33 -0
  67. package/dist/components/Table/Table.d.ts.map +1 -0
  68. package/dist/components/Table/index.d.ts +3 -0
  69. package/dist/components/Table/index.d.ts.map +1 -0
  70. package/dist/components/Tabs/Tabs.d.ts +22 -0
  71. package/dist/components/Tabs/Tabs.d.ts.map +1 -0
  72. package/dist/components/Tabs/index.d.ts +3 -0
  73. package/dist/components/Tabs/index.d.ts.map +1 -0
  74. package/dist/components/TextField/TextField.d.ts +23 -0
  75. package/dist/components/TextField/TextField.d.ts.map +1 -0
  76. package/dist/components/TextField/index.d.ts +3 -0
  77. package/dist/components/TextField/index.d.ts.map +1 -0
  78. package/dist/components/Textarea/Textarea.d.ts +15 -0
  79. package/dist/components/Textarea/Textarea.d.ts.map +1 -0
  80. package/dist/components/Textarea/index.d.ts +3 -0
  81. package/dist/components/Textarea/index.d.ts.map +1 -0
  82. package/dist/components/Toast/Toast.d.ts +24 -0
  83. package/dist/components/Toast/Toast.d.ts.map +1 -0
  84. package/dist/components/Toast/index.d.ts +3 -0
  85. package/dist/components/Toast/index.d.ts.map +1 -0
  86. package/dist/index.cjs +2 -0
  87. package/dist/index.cjs.map +1 -0
  88. package/dist/index.d.ts +23 -0
  89. package/dist/index.d.ts.map +1 -0
  90. package/dist/index.js +1472 -0
  91. package/dist/index.js.map +1 -0
  92. package/dist/styles.css +2 -0
  93. package/dist/utils/cx.d.ts +3 -0
  94. package/dist/utils/cx.d.ts.map +1 -0
  95. package/dist/utils/useFocusTrap.d.ts +8 -0
  96. package/dist/utils/useFocusTrap.d.ts.map +1 -0
  97. package/package.json +60 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../icons/dist/icons.js","../../icons/dist/index.js","../src/components/Icon/Icon.tsx","../src/utils/cx.ts","../src/components/Button/Button.tsx","../src/components/IconButton/IconButton.tsx","../src/components/TextField/TextField.tsx","../src/components/Textarea/Textarea.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Radio/Radio.tsx","../src/components/Switch/Switch.tsx","../src/components/Badge/Badge.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Card/Card.tsx","../src/components/Skeleton/Skeleton.tsx","../src/components/Spinner/Spinner.tsx","../src/components/FormField/FormField.tsx","../src/components/Alert/Alert.tsx","../src/components/EmptyState/EmptyState.tsx","../src/utils/useFocusTrap.ts","../src/components/Modal/Modal.tsx","../../core/dist/keyboard.js","../../core/dist/tabs.js","../src/components/Tabs/Tabs.tsx","../src/components/Table/Table.tsx","../src/components/Toast/Toast.tsx","../src/components/Sidebar/Sidebar.tsx"],"sourcesContent":["// @iskra-ui/icons — canonical Искра.DCI icon set.\n// Linear (outline) icons on a 16×16 grid, 1.5px stroke, round caps, `currentColor`.\n// Drawn to match the Feather Icons / Heroicons (outline) geometry the brand uses.\n// Each value is the raw inner SVG markup for a `<svg viewBox=\"0 0 16 16\">`.\nexport const icons = {\n /* chevrons & arrows */\n 'chevron-down': '<polyline points=\"4,6 8,10 12,6\"/>',\n 'chevron-up': '<polyline points=\"4,10 8,6 12,10\"/>',\n 'chevron-left': '<polyline points=\"10,4 6,8 10,12\"/>',\n 'chevron-right': '<polyline points=\"6,4 10,8 6,12\"/>',\n 'chevrons-left': '<polyline points=\"7.5,4 3.5,8 7.5,12\"/><polyline points=\"12,4 8,8 12,12\"/>',\n 'chevrons-right': '<polyline points=\"8.5,4 12.5,8 8.5,12\"/><polyline points=\"4,4 8,8 4,12\"/>',\n 'arrow-up': '<line x1=\"8\" y1=\"13.5\" x2=\"8\" y2=\"3\"/><polyline points=\"4,7 8,3 12,7\"/>',\n 'arrow-down': '<line x1=\"8\" y1=\"2.5\" x2=\"8\" y2=\"13\"/><polyline points=\"4,9 8,13 12,9\"/>',\n 'arrow-left': '<line x1=\"13.5\" y1=\"8\" x2=\"3\" y2=\"8\"/><polyline points=\"7,4 3,8 7,12\"/>',\n 'arrow-right': '<line x1=\"2.5\" y1=\"8\" x2=\"13\" y2=\"8\"/><polyline points=\"9,4 13,8 9,12\"/>',\n 'arrow-up-right': '<line x1=\"4\" y1=\"12\" x2=\"12\" y2=\"4\"/><polyline points=\"5.5,4 12,4 12,10.5\"/>',\n external: '<path d=\"M8.5 3H4a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V7.5\"/><polyline points=\"9.5,2.5 13.5,2.5 13.5,6.5\"/><line x1=\"13.5\" y1=\"2.5\" x2=\"7.5\" y2=\"8.5\"/>',\n menu: '<line x1=\"2.5\" y1=\"4.5\" x2=\"13.5\" y2=\"4.5\"/><line x1=\"2.5\" y1=\"8\" x2=\"13.5\" y2=\"8\"/><line x1=\"2.5\" y1=\"11.5\" x2=\"13.5\" y2=\"11.5\"/>',\n more: '<circle cx=\"3.5\" cy=\"8\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"8\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"12.5\" cy=\"8\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/>',\n 'more-vertical': '<circle cx=\"8\" cy=\"3.5\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"8\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"8\" cy=\"12.5\" r=\"1.1\" fill=\"currentColor\" stroke=\"none\"/>',\n /* core actions */\n check: '<polyline points=\"3.5,8.5 6.5,11.5 12.5,4.5\"/>',\n close: '<line x1=\"4\" y1=\"4\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"4\" x2=\"4\" y2=\"12\"/>',\n plus: '<line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"13\"/><line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\"/>',\n minus: '<line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\"/>',\n 'check-circle': '<circle cx=\"8\" cy=\"8\" r=\"6\"/><polyline points=\"5.3,8.2 7,10 10.7,5.8\"/>',\n 'x-circle': '<circle cx=\"8\" cy=\"8\" r=\"6\"/><line x1=\"5.7\" y1=\"5.7\" x2=\"10.3\" y2=\"10.3\"/><line x1=\"10.3\" y1=\"5.7\" x2=\"5.7\" y2=\"10.3\"/>',\n 'plus-circle': '<circle cx=\"8\" cy=\"8\" r=\"6\"/><line x1=\"8\" y1=\"5.3\" x2=\"8\" y2=\"10.7\"/><line x1=\"5.3\" y1=\"8\" x2=\"10.7\" y2=\"8\"/>',\n 'minus-circle': '<circle cx=\"8\" cy=\"8\" r=\"6\"/><line x1=\"5.3\" y1=\"8\" x2=\"10.7\" y2=\"8\"/>',\n /* status (Badge family) */\n success: '<circle cx=\"8\" cy=\"8\" r=\"6\"/><polyline points=\"5.3,8.2 7,10 10.7,5.8\"/>',\n warning: '<path d=\"M8 2.2 14.3 13.2a.6.6 0 0 1-.52.9H2.22a.6.6 0 0 1-.52-.9Z\"/><line x1=\"8\" y1=\"6.4\" x2=\"8\" y2=\"9.6\"/><circle cx=\"8\" cy=\"11.6\" r=\".55\" fill=\"currentColor\" stroke=\"none\"/>',\n error: '<circle cx=\"8\" cy=\"8\" r=\"6\"/><line x1=\"5.7\" y1=\"5.7\" x2=\"10.3\" y2=\"10.3\"/><line x1=\"10.3\" y1=\"5.7\" x2=\"5.7\" y2=\"10.3\"/>',\n info: '<circle cx=\"8\" cy=\"8\" r=\"6\"/><line x1=\"8\" y1=\"7.4\" x2=\"8\" y2=\"11\"/><circle cx=\"8\" cy=\"5\" r=\".55\" fill=\"currentColor\" stroke=\"none\"/>',\n help: '<circle cx=\"8\" cy=\"8\" r=\"6\"/><path d=\"M6.2 6.3a1.85 1.85 0 0 1 3.6.6c0 1.25-1.8 1.55-1.8 2.7\"/><circle cx=\"8\" cy=\"11.5\" r=\".55\" fill=\"currentColor\" stroke=\"none\"/>',\n /* find / filter / sync */\n search: '<circle cx=\"7\" cy=\"7\" r=\"4.5\"/><line x1=\"10.5\" y1=\"10.5\" x2=\"14.5\" y2=\"14.5\"/>',\n filter: '<path d=\"M2.5 4h11l-4.2 5v3.8l-2.6-1.3V9z\"/>',\n sliders: '<line x1=\"2.5\" y1=\"5\" x2=\"13.5\" y2=\"5\"/><line x1=\"2.5\" y1=\"11\" x2=\"13.5\" y2=\"11\"/><circle cx=\"6\" cy=\"5\" r=\"1.8\" fill=\"var(--bg,#0D1117)\"/><circle cx=\"10.5\" cy=\"11\" r=\"1.8\" fill=\"var(--bg,#0D1117)\"/>',\n refresh: '<path d=\"M2.7 8a5.3 5.3 0 0 1 9-3.8l1.6 1.5\"/><polyline points=\"13.3,2.3 13.3,5.7 9.9,5.7\"/><path d=\"M13.3 8a5.3 5.3 0 0 1-9 3.8l-1.6-1.5\"/><polyline points=\"2.7,13.7 2.7,10.3 6.1,10.3\"/>',\n sync: '<path d=\"M3.5 6.5A5 5 0 0 1 12.8 6\"/><polyline points=\"12.5,2.6 13,6 9.6,6.4\"/><path d=\"M12.5 9.5A5 5 0 0 1 3.2 10\"/><polyline points=\"3.5,13.4 3,10 6.4,9.6\"/>',\n undo: '<polyline points=\"5.5,4 2.5,7 5.5,10\"/><path d=\"M2.5 7h6.5a3.5 3.5 0 0 1 0 7H6\"/>',\n redo: '<polyline points=\"10.5,4 13.5,7 10.5,10\"/><path d=\"M13.5 7H7a3.5 3.5 0 0 0 0 7h3\"/>',\n /* edit / file ops */\n trash: '<polyline points=\"3,4.5 13,4.5\"/><path d=\"M5.5 4.5V3.2a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1V4.5\"/><path d=\"M4.3 4.5 5 13a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1l.7-8.5\"/>',\n edit: '<path d=\"M11 2.5 13.5 5 6 12.5 3 13.5 4 10.5Z\"/><line x1=\"9.5\" y1=\"4\" x2=\"12\" y2=\"6.5\"/>',\n copy: '<rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8\" rx=\"1.2\"/><path d=\"M3.5 10.5a1 1 0 0 1-1-1V3.5a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1\"/>',\n save: '<path d=\"M3 2.5h8L13.5 5v8.5a1 1 0 0 1-1 1h-9a1 1 0 0 1-1-1v-10a1 1 0 0 1 1-1Z\"/><path d=\"M5 2.5v3h5v-3\"/><rect x=\"5\" y=\"8.5\" width=\"6\" height=\"4\"/>',\n download: '<line x1=\"8\" y1=\"2.5\" x2=\"8\" y2=\"10\"/><polyline points=\"5,7 8,10 11,7\"/><path d=\"M3 11.5v1a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1v-1\"/>',\n upload: '<line x1=\"8\" y1=\"10.5\" x2=\"8\" y2=\"3\"/><polyline points=\"5,6 8,3 11,6\"/><path d=\"M3 11.5v1a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1v-1\"/>',\n share: '<circle cx=\"12\" cy=\"4\" r=\"2\"/><circle cx=\"4\" cy=\"8\" r=\"2\"/><circle cx=\"12\" cy=\"12\" r=\"2\"/><line x1=\"5.7\" y1=\"7\" x2=\"10.3\" y2=\"5\"/><line x1=\"5.7\" y1=\"9\" x2=\"10.3\" y2=\"11\"/>',\n link: '<path d=\"M6.8 9.2a2.6 2.6 0 0 0 3.7 0l2.1-2.1a2.6 2.6 0 0 0-3.7-3.7l-1 1\"/><path d=\"M9.2 6.8a2.6 2.6 0 0 0-3.7 0L3.4 8.9a2.6 2.6 0 0 0 3.7 3.7l1-1\"/>',\n clipboard: '<rect x=\"3.5\" y=\"3\" width=\"9\" height=\"11\" rx=\"1.2\"/><rect x=\"6\" y=\"1.8\" width=\"4\" height=\"2.4\" rx=\"0.7\"/>',\n folder: '<path d=\"M2.5 4.5a1 1 0 0 1 1-1h2.6l1.2 1.4h4.7a1 1 0 0 1 1 1v6.1a1 1 0 0 1-1 1h-9a1 1 0 0 1-1-1Z\"/>',\n file: '<path d=\"M4 2.5h5L12.5 6v7a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V3.5a1 1 0 0 1 1-1Z\"/><polyline points=\"9,2.5 9,6 12.5,6\"/>',\n 'file-text': '<path d=\"M4 2.5h5L12.5 6v7a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V3.5a1 1 0 0 1 1-1Z\"/><polyline points=\"9,2.5 9,6 12.5,6\"/><line x1=\"5.5\" y1=\"8.5\" x2=\"10\" y2=\"8.5\"/><line x1=\"5.5\" y1=\"11\" x2=\"10\" y2=\"11\"/>',\n /* visibility */\n eye: '<path d=\"M1.5 8S3.5 3.5 8 3.5 14.5 8 14.5 8 12.5 12.5 8 12.5 1.5 8 1.5 8Z\"/><circle cx=\"8\" cy=\"8\" r=\"2\"/>',\n 'eye-off': '<path d=\"M3 3l10 10\"/><path d=\"M6.5 6.6A2 2 0 0 0 8 10a2 2 0 0 0 1.4-.6\"/><path d=\"M4.2 4.7C2.6 5.8 1.5 8 1.5 8s2 4.5 6.5 4.5c1 0 1.9-.2 2.7-.6\"/><path d=\"M7 3.6A6 6 0 0 1 8 3.5C12.5 3.5 14.5 8 14.5 8a12 12 0 0 1-1.7 2.3\"/>',\n /* alerts / security */\n bell: '<path d=\"M8 2a4 4 0 0 1 4 4c0 3 1.2 4 1.2 4H2.8S4 9 4 6a4 4 0 0 1 4-4z\"/><path d=\"M6.4 12.5a1.7 1.7 0 0 0 3.2 0\"/>',\n 'bell-off': '<path d=\"M5 4.2A4 4 0 0 1 12 6c0 2.2.7 3.4 1 3.8M4.2 6.7C4.1 8.7 3 10 3 10h7.5\"/><path d=\"M6.4 12.5a1.7 1.7 0 0 0 3.2 0\"/><line x1=\"2.5\" y1=\"2.5\" x2=\"13.5\" y2=\"13.5\"/>',\n lock: '<rect x=\"3.5\" y=\"7\" width=\"9\" height=\"6.5\" rx=\"1.2\"/><path d=\"M5.5 7V5.2a2.5 2.5 0 0 1 5 0V7\"/>',\n unlock: '<rect x=\"3.5\" y=\"7\" width=\"9\" height=\"6.5\" rx=\"1.2\"/><path d=\"M5.5 7V5.2a2.5 2.5 0 0 1 4.8-.9\"/>',\n shield: '<path d=\"M8 1.7 13 3.5v4.2c0 3.3-2.3 5.6-5 6.6-2.7-1-5-3.3-5-6.6V3.5Z\"/>',\n 'shield-check': '<path d=\"M8 1.7 13 3.5v4.2c0 3.3-2.3 5.6-5 6.6-2.7-1-5-3.3-5-6.6V3.5Z\"/><polyline points=\"5.7,7.8 7.3,9.4 10.4,5.9\"/>',\n key: '<circle cx=\"5.5\" cy=\"10.5\" r=\"2.6\"/><line x1=\"7.4\" y1=\"8.6\" x2=\"13\" y2=\"3\"/><line x1=\"11\" y1=\"5\" x2=\"12.6\" y2=\"6.6\"/><line x1=\"9.4\" y1=\"6.6\" x2=\"11\" y2=\"8.2\"/>',\n zap: '<polygon points=\"8.5,1.8 3.5,9 7.5,9 7,14.2 12.5,7 8.5,7\"/>',\n activity: '<polyline points=\"1.5,8 5,8 7,3 9.5,13 11.5,8 14.5,8\"/>',\n /* domain */\n settings: '<circle cx=\"8\" cy=\"8\" r=\"2.3\"/><path d=\"M12.6 9.5a1 1 0 0 0 .2 1.1l.05.05a1.2 1.2 0 1 1-1.7 1.7l-.05-.05a1 1 0 0 0-1.1-.2 1 1 0 0 0-.6.9v.15a1.2 1.2 0 1 1-2.4 0v-.08a1 1 0 0 0-.66-.92 1 1 0 0 0-1.1.2l-.05.05a1.2 1.2 0 1 1-1.7-1.7l.05-.05a1 1 0 0 0 .2-1.1 1 1 0 0 0-.9-.6h-.15a1.2 1.2 0 1 1 0-2.4h.08a1 1 0 0 0 .92-.66 1 1 0 0 0-.2-1.1l-.05-.05a1.2 1.2 0 1 1 1.7-1.7l.05.05a1 1 0 0 0 1.1.2H7a1 1 0 0 0 .6-.9v-.15a1.2 1.2 0 1 1 2.4 0v.08a1 1 0 0 0 .6.92 1 1 0 0 0 1.1-.2l.05-.05a1.2 1.2 0 1 1 1.7 1.7l-.05.05a1 1 0 0 0-.2 1.1V7a1 1 0 0 0 .9.6h.15a1.2 1.2 0 1 1 0 2.4h-.08a1 1 0 0 0-.92.6Z\"/>',\n user: '<circle cx=\"8\" cy=\"5.5\" r=\"2.8\"/><path d=\"M2.5 14c0-3 2.4-4.8 5.5-4.8s5.5 1.8 5.5 4.8\"/>',\n users: '<circle cx=\"6\" cy=\"5.5\" r=\"2.4\"/><path d=\"M1.5 13.5c0-2.6 2-4.2 4.5-4.2s4.5 1.6 4.5 4.2\"/><path d=\"M11 3.4a2.4 2.4 0 0 1 0 4.6M14.5 13.5c0-2-1.1-3.4-2.8-4\"/>',\n 'user-plus': '<circle cx=\"6.5\" cy=\"5.5\" r=\"2.8\"/><path d=\"M1.5 14c0-3 2.2-4.8 5-4.8 1 0 1.9.2 2.6.6\"/><line x1=\"12.5\" y1=\"9.5\" x2=\"12.5\" y2=\"13.5\"/><line x1=\"10.5\" y1=\"11.5\" x2=\"14.5\" y2=\"11.5\"/>',\n calendar: '<rect x=\"2.5\" y=\"3.5\" width=\"11\" height=\"10\" rx=\"1.2\"/><line x1=\"2.5\" y1=\"6.5\" x2=\"13.5\" y2=\"6.5\"/><line x1=\"5.5\" y1=\"2\" x2=\"5.5\" y2=\"4.5\"/><line x1=\"10.5\" y1=\"2\" x2=\"10.5\" y2=\"4.5\"/>',\n clock: '<circle cx=\"8\" cy=\"8\" r=\"6\"/><polyline points=\"8,4.5 8,8 10.5,9.5\"/>',\n history: '<path d=\"M2.7 8a5.3 5.3 0 1 0 1.6-3.8\"/><polyline points=\"2.4,2.5 2.4,5.7 5.6,5.7\"/><polyline points=\"8,5.2 8,8 10.4,9.4\"/>',\n server: '<rect x=\"2.5\" y=\"3\" width=\"11\" height=\"4.2\" rx=\"1\"/><rect x=\"2.5\" y=\"8.8\" width=\"11\" height=\"4.2\" rx=\"1\"/><line x1=\"4.5\" y1=\"5.1\" x2=\"4.55\" y2=\"5.1\"/><line x1=\"4.5\" y1=\"10.9\" x2=\"4.55\" y2=\"10.9\"/>',\n database: '<ellipse cx=\"8\" cy=\"4\" rx=\"5\" ry=\"2\"/><path d=\"M3 4v8c0 1.1 2.2 2 5 2s5-.9 5-2V4\"/><path d=\"M3 8c0 1.1 2.2 2 5 2s5-.9 5-2\"/>',\n cloud: '<path d=\"M4.5 12.5a3 3 0 0 1-.3-6A4 4 0 0 1 12 7a2.8 2.8 0 0 1-.3 5.5Z\"/>',\n cpu: '<rect x=\"4.5\" y=\"4.5\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"6.7\" y=\"6.7\" width=\"2.6\" height=\"2.6\"/><line x1=\"6.5\" y1=\"2.5\" x2=\"6.5\" y2=\"4.5\"/><line x1=\"9.5\" y1=\"2.5\" x2=\"9.5\" y2=\"4.5\"/><line x1=\"6.5\" y1=\"11.5\" x2=\"6.5\" y2=\"13.5\"/><line x1=\"9.5\" y1=\"11.5\" x2=\"9.5\" y2=\"13.5\"/><line x1=\"2.5\" y1=\"6.5\" x2=\"4.5\" y2=\"6.5\"/><line x1=\"2.5\" y1=\"9.5\" x2=\"4.5\" y2=\"9.5\"/><line x1=\"11.5\" y1=\"6.5\" x2=\"13.5\" y2=\"6.5\"/><line x1=\"11.5\" y1=\"9.5\" x2=\"13.5\" y2=\"9.5\"/>',\n globe: '<circle cx=\"8\" cy=\"8\" r=\"6\"/><line x1=\"2\" y1=\"8\" x2=\"14\" y2=\"8\"/><path d=\"M8 2c1.8 1.6 2.8 3.8 2.8 6S9.8 12.4 8 14c-1.8-1.6-2.8-3.8-2.8-6S6.2 3.6 8 2Z\"/>',\n wifi: '<path d=\"M2 6.2a9 9 0 0 1 12 0\"/><path d=\"M4.2 8.6a6 6 0 0 1 7.6 0\"/><path d=\"M6.4 11a3 3 0 0 1 3.2 0\"/><circle cx=\"8\" cy=\"13\" r=\".7\" fill=\"currentColor\" stroke=\"none\"/>',\n terminal: '<rect x=\"2.5\" y=\"3\" width=\"11\" height=\"10\" rx=\"1.2\"/><polyline points=\"5,7 7,8.5 5,10\"/><line x1=\"8.5\" y1=\"10.5\" x2=\"11\" y2=\"10.5\"/>',\n code: '<polyline points=\"6,5 2.5,8 6,11\"/><polyline points=\"10,5 13.5,8 10,11\"/>',\n 'git-branch': '<line x1=\"4.5\" y1=\"3\" x2=\"4.5\" y2=\"13\"/><circle cx=\"4.5\" cy=\"3\" r=\"1.7\"/><circle cx=\"4.5\" cy=\"13\" r=\"1.7\"/><circle cx=\"11.5\" cy=\"5\" r=\"1.7\"/><path d=\"M11.5 6.7v.8a3 3 0 0 1-3 3H4.5\"/>',\n layers: '<polygon points=\"8,2 14,5 8,8 2,5\"/><polyline points=\"2,8 8,11 14,8\"/><polyline points=\"2,11 8,14 14,11\"/>',\n grid: '<rect x=\"2.5\" y=\"2.5\" width=\"4.5\" height=\"4.5\" rx=\"1\"/><rect x=\"9\" y=\"2.5\" width=\"4.5\" height=\"4.5\" rx=\"1\"/><rect x=\"2.5\" y=\"9\" width=\"4.5\" height=\"4.5\" rx=\"1\"/><rect x=\"9\" y=\"9\" width=\"4.5\" height=\"4.5\" rx=\"1\"/>',\n list: '<line x1=\"5.5\" y1=\"4\" x2=\"13.5\" y2=\"4\"/><line x1=\"5.5\" y1=\"8\" x2=\"13.5\" y2=\"8\"/><line x1=\"5.5\" y1=\"12\" x2=\"13.5\" y2=\"12\"/><circle cx=\"2.8\" cy=\"4\" r=\".8\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"2.8\" cy=\"8\" r=\".8\" fill=\"currentColor\" stroke=\"none\"/><circle cx=\"2.8\" cy=\"12\" r=\".8\" fill=\"currentColor\" stroke=\"none\"/>',\n tag: '<path d=\"M2.6 7.4 7.4 2.6a1 1 0 0 1 .7-.3h4.1a1 1 0 0 1 1 1V7.4a1 1 0 0 1-.3.7l-4.8 4.8a1 1 0 0 1-1.4 0L2.6 8.8a1 1 0 0 1 0-1.4Z\"/><circle cx=\"10.2\" cy=\"5.8\" r=\".9\" fill=\"currentColor\" stroke=\"none\"/>',\n bookmark: '<path d=\"M4 2.5h8a.5.5 0 0 1 .5.5v10.5L8 11l-4.5 2.5V3a.5.5 0 0 1 .5-.5Z\"/>',\n star: '<polygon points=\"8,2 9.85,5.75 14,6.35 11,9.25 11.7,13.35 8,11.4 4.3,13.35 5,9.25 2,6.35 6.15,5.75\"/>',\n pin: '<path d=\"M8 14s4.5-4 4.5-7.5a4.5 4.5 0 0 0-9 0C3.5 10 8 14 8 14Z\"/><circle cx=\"8\" cy=\"6.5\" r=\"1.7\"/>',\n mail: '<rect x=\"2\" y=\"3.5\" width=\"12\" height=\"9\" rx=\"1.2\"/><polyline points=\"2.5,4.5 8,8.5 13.5,4.5\"/>',\n message: '<path d=\"M2.5 4a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1H6l-3 2.5V11H3.5a1 1 0 0 1-1-1Z\"/>',\n /* theme / power */\n sun: '<circle cx=\"8\" cy=\"8\" r=\"3\"/><path d=\"M8 1v1.6M8 13.4V15M15 8h-1.6M2.6 8H1M12.95 3.05l-1.13 1.13M4.18 11.82l-1.13 1.13M12.95 12.95l-1.13-1.13M4.18 4.18 3.05 3.05\"/>',\n moon: '<path d=\"M13 9.2A5.5 5.5 0 0 1 6.8 3 5.5 5.5 0 1 0 13 9.2Z\"/>',\n power: '<line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"8\"/><path d=\"M5 4.2a5 5 0 1 0 6 0\"/>',\n 'log-out': '<path d=\"M6 13.5H3.5a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1H6\"/><polyline points=\"10,11 13.5,8 10,5\"/><line x1=\"13.5\" y1=\"8\" x2=\"6\" y2=\"8\"/>',\n 'log-in': '<path d=\"M10 2.5h2.5a1 1 0 0 1 1 1v9a1 1 0 0 1-1 1H10\"/><polyline points=\"6,11 9.5,8 6,5\"/><line x1=\"9.5\" y1=\"8\" x2=\"2\" y2=\"8\"/>',\n};\n//# sourceMappingURL=icons.js.map","// @iskra-ui/icons — framework-agnostic icon data + a tiny SVG-string helper.\n// Framework wrappers (React `<Icon>`, Vue `<Icon>`) consume `icons[name]`.\nimport { icons } from './icons.js';\nexport { icons };\nexport const iconNames = Object.keys(icons);\n/** Returns a complete `<svg>…</svg>` string for the given icon (SSR / non-React use). */\nexport function iconSvg(name, opts = {}) {\n const { size = '1em', strokeWidth = 1.5, title, className } = opts;\n const px = typeof size === 'number' ? `${size}px` : size;\n const inner = icons[name];\n const titleTag = title ? `<title>${title}</title>` : '';\n const a11y = title ? `role=\"img\" aria-label=\"${title}\"` : 'aria-hidden=\"true\"';\n const cls = className ? ` class=\"${className}\"` : '';\n return (`<svg${cls} width=\"${px}\" height=\"${px}\" viewBox=\"0 0 16 16\" fill=\"none\" ` +\n `stroke=\"currentColor\" stroke-width=\"${strokeWidth}\" stroke-linecap=\"round\" ` +\n `stroke-linejoin=\"round\" ${a11y}>${titleTag}${inner}</svg>`);\n}\n//# sourceMappingURL=index.js.map","import { type CSSProperties, type SVGProps } from 'react';\nimport { icons, iconNames, type IconName } from '@iskra-ui/icons';\n\nexport type { IconName };\n/** All registered icon names — handy for tooling / showcases. */\nexport const ICON_NAMES = iconNames;\n\nexport interface IconProps extends Omit<SVGProps<SVGSVGElement>, 'name'> {\n /** Icon name from the canonical set. */\n name: IconName;\n /** Size — number (px) or any CSS length. Defaults to 1em (scales with text). */\n size?: number | string;\n strokeWidth?: number;\n /** Accessible name. When omitted the icon is decorative (aria-hidden). */\n title?: string;\n style?: CSSProperties;\n}\n\n/**\n * Icon — single shared 16×16 / 1.5px-stroke outline set. Monochrome, inherits\n * `currentColor`. Provide `title` to expose an accessible name.\n */\nexport function Icon({\n name,\n size = '1em',\n strokeWidth = 1.5,\n title,\n className,\n style,\n ...rest\n}: IconProps) {\n const inner = icons[name];\n const px = typeof size === 'number' ? `${size}px` : size;\n return (\n <svg\n className={('iskra-icon ' + (className ?? '')).trim()}\n width={px}\n height={px}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n role={title ? 'img' : undefined}\n aria-hidden={title ? undefined : 'true'}\n aria-label={title || undefined}\n style={{ display: 'inline-block', flexShrink: 0, verticalAlign: 'middle', ...style }}\n dangerouslySetInnerHTML={{ __html: (title ? `<title>${title}</title>` : '') + inner }}\n {...rest}\n />\n );\n}\n","/** Joins truthy class-name fragments into a single string. */\nexport function cx(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(' ');\n}\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Button.css';\n\nexport type ButtonVariant = 'primary' | 'outline' | 'secondary' | 'ghost' | 'destructive';\nexport type ButtonSize = 's' | 'm' | 'l';\n\nexport interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'color'> {\n /** Visual variant. */\n variant?: ButtonVariant;\n /** Control size — s·m·l map to 28·32·36px height. */\n size?: ButtonSize;\n /** Icon rendered before the label. */\n iconBefore?: ReactNode;\n /** Icon rendered after the label. */\n iconAfter?: ReactNode;\n /** Square icon-only button (requires an accessible name via aria-label). */\n iconOnly?: boolean;\n /** Shows a spinner and disables interaction. */\n loading?: boolean;\n /** Stretches to the full width of its container. */\n fullWidth?: boolean;\n}\n\n/**\n * Button — primary action control. Always renders a native `<button>`.\n * For toggle buttons set `aria-pressed`; for icon-only buttons set `aria-label`.\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = 'primary',\n size = 'm',\n iconBefore,\n iconAfter,\n iconOnly = false,\n loading = false,\n disabled = false,\n fullWidth = false,\n type = 'button',\n className,\n children,\n ...rest\n },\n ref,\n) {\n const cls = cx(\n 'ik-btn',\n `ik-btn-${variant}`,\n `ik-btn-${size}`,\n iconOnly && 'ik-btn-io',\n fullWidth && 'ik-btn-fw',\n loading && 'ik-btn-loading',\n className,\n );\n\n return (\n <button ref={ref} type={type} className={cls} disabled={disabled || loading} {...rest}>\n {loading && <span className=\"ik-btn-spinner\" aria-hidden=\"true\" />}\n <span className=\"ik-btn-content\">\n {iconBefore}\n {!iconOnly && children != null && <span>{children}</span>}\n {iconOnly && children}\n {iconAfter}\n </span>\n </button>\n );\n});\n","import { forwardRef, type ReactNode } from 'react';\nimport { Button, type ButtonProps } from '../Button/Button.js';\n\nexport interface IconButtonProps extends Omit<\n ButtonProps,\n 'iconOnly' | 'children' | 'iconBefore' | 'iconAfter'\n> {\n /** The icon to render. */\n icon: ReactNode;\n /** Accessible name — required because there is no visible text. */\n 'aria-label': string;\n}\n\n/** IconButton — square, icon-only button. Always requires an accessible name. */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { icon, ...rest },\n ref,\n) {\n return (\n <Button ref={ref} iconOnly {...rest}>\n {icon}\n </Button>\n );\n});\n","import { useId, useRef, useState, type InputHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './TextField.css';\n\nexport type TextFieldSize = 's' | 'm' | 'l';\n\nexport interface TextFieldProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'prefix'\n> {\n size?: TextFieldSize;\n label?: ReactNode;\n hint?: ReactNode;\n /** Error message (string) or boolean error state. */\n error?: ReactNode | boolean;\n required?: boolean;\n iconBefore?: ReactNode;\n clearable?: boolean;\n onClear?: () => void;\n clearLabel?: string;\n wrapClassName?: string;\n}\n\n/**\n * TextField — single-line text input with label, hint, error, leading icon and\n * an optional clear button. Controlled or uncontrolled. Wires `aria-describedby`\n * / `aria-invalid` for screen readers.\n */\nexport function TextField({\n size = 'm',\n label,\n hint,\n error,\n required = false,\n iconBefore,\n clearable = false,\n onClear,\n disabled = false,\n value,\n defaultValue,\n onChange,\n id,\n className,\n wrapClassName,\n clearLabel = 'Очистить',\n ...rest\n}: TextFieldProps) {\n const autoId = useId();\n const inputId = id ?? `ik-tf-${autoId}`;\n const inputRef = useRef<HTMLInputElement>(null);\n\n const controlled = value != null;\n const [hasVal, setHasVal] = useState(\n controlled ? String(value).length > 0 : String(defaultValue ?? '').length > 0,\n );\n const showClear = clearable && !disabled && (controlled ? String(value).length > 0 : hasVal);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (!controlled) setHasVal(e.target.value.length > 0);\n onChange?.(e);\n };\n\n const handleClear = () => {\n const el = inputRef.current;\n if (el) {\n const setter = Object.getOwnPropertyDescriptor(\n window.HTMLInputElement.prototype,\n 'value',\n )?.set;\n setter?.call(el, '');\n el.dispatchEvent(new Event('input', { bubbles: true }));\n el.focus();\n }\n if (!controlled) setHasVal(false);\n onClear?.();\n };\n\n const errText = typeof error === 'string' ? error : null;\n const isError = Boolean(error);\n\n return (\n <div className={cx('ik-tf-wrap', wrapClassName)}>\n {label && (\n <label className=\"ik-tf-label\" htmlFor={inputId}>\n {label}\n {required && (\n <span className=\"ik-tf-req\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n <div\n className={cx(\n 'ik-tf-field',\n `ik-tf-${size}`,\n isError && 'is-error',\n disabled && 'is-disabled',\n className,\n )}\n >\n {iconBefore && <span className=\"ik-tf-ico\">{iconBefore}</span>}\n <input\n ref={inputRef}\n id={inputId}\n className=\"ik-tf-input\"\n disabled={disabled}\n value={value}\n defaultValue={defaultValue}\n onChange={handleChange}\n aria-invalid={isError || undefined}\n aria-describedby={errText || hint ? `${inputId}-msg` : undefined}\n {...rest}\n />\n {showClear && (\n <button\n type=\"button\"\n className=\"ik-tf-clear\"\n onClick={handleClear}\n aria-label={clearLabel}\n >\n <svg\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"4\" y1=\"4\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"4\" x2=\"4\" y2=\"12\" />\n </svg>\n </button>\n )}\n </div>\n {(errText || hint) && (\n <div id={`${inputId}-msg`} className={cx('ik-tf-msg', isError && 'is-error')}>\n {errText || hint}\n </div>\n )}\n </div>\n );\n}\n","import { useId, useState, type ReactNode, type TextareaHTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Textarea.css';\n\nexport interface TextareaProps extends Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, 'style'> {\n label?: ReactNode;\n hint?: ReactNode;\n error?: ReactNode | boolean;\n required?: boolean;\n resize?: 'none' | 'vertical';\n /** Show a `value.length / maxLength` counter (requires maxLength). */\n showCount?: boolean;\n wrapClassName?: string;\n}\n\n/** Textarea — multi-line text input with label, hint, error and optional counter. */\nexport function Textarea({\n label,\n hint,\n error,\n required = false,\n resize = 'vertical',\n showCount = false,\n rows = 4,\n maxLength,\n value,\n defaultValue,\n onChange,\n id,\n className,\n wrapClassName,\n ...rest\n}: TextareaProps) {\n const autoId = useId();\n const taId = id ?? `ik-ta-${autoId}`;\n const controlled = value != null;\n const [count, setCount] = useState(\n controlled ? String(value).length : String(defaultValue ?? '').length,\n );\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!controlled) setCount(e.target.value.length);\n onChange?.(e);\n };\n\n const errText = typeof error === 'string' ? error : null;\n const isError = Boolean(error);\n const currentCount = controlled ? String(value).length : count;\n\n return (\n <div className={cx('ik-ta-wrap', wrapClassName)}>\n {label && (\n <label className=\"ik-ta-label\" htmlFor={taId}>\n {label}\n {required && (\n <span className=\"ik-ta-req\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n <textarea\n id={taId}\n className={cx('ik-ta-field', `ik-ta-resize-${resize}`, isError && 'is-error', className)}\n rows={rows}\n maxLength={maxLength}\n value={value}\n defaultValue={defaultValue}\n onChange={handleChange}\n aria-invalid={isError || undefined}\n aria-describedby={errText || hint ? `${taId}-msg` : undefined}\n {...rest}\n />\n {(errText || hint || (showCount && maxLength)) && (\n <div className=\"ik-ta-foot\">\n {(errText || hint) && (\n <span id={`${taId}-msg`} className={cx('ik-ta-msg', isError && 'is-error')}>\n {errText || hint}\n </span>\n )}\n {showCount && maxLength != null && (\n <span className=\"ik-ta-count\">\n {currentCount}/{maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n","import { useEffect, useId, useRef, type InputHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Checkbox.css';\n\nexport type CheckboxSize = 's' | 'm';\n\nexport interface CheckboxProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'type'\n> {\n indeterminate?: boolean;\n size?: CheckboxSize;\n label?: ReactNode;\n description?: ReactNode;\n}\n\n/** Checkbox — checked / indeterminate / disabled, with optional label + description. */\nexport function Checkbox({\n checked,\n defaultChecked,\n indeterminate = false,\n disabled = false,\n size = 'm',\n label,\n description,\n onChange,\n id,\n className,\n ...rest\n}: CheckboxProps) {\n const autoId = useId();\n const inputId = id ?? `ik-cb-${autoId}`;\n const ref = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (ref.current) ref.current.indeterminate = indeterminate;\n }, [indeterminate, checked]);\n\n return (\n <label\n className={cx('ik-cb', `ik-cb-${size}`, disabled && 'is-disabled', className)}\n htmlFor={inputId}\n >\n <input\n ref={ref}\n id={inputId}\n type=\"checkbox\"\n className=\"ik-cb-input\"\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled}\n onChange={onChange}\n {...rest}\n />\n <span className=\"ik-cb-box\" aria-hidden=\"true\">\n <svg\n className=\"ik-cb-check\"\n width=\"11\"\n height=\"11\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"3.5,8.5 6.5,11.5 12.5,4.5\" />\n </svg>\n <svg\n className=\"ik-cb-dash\"\n width=\"11\"\n height=\"11\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n >\n <line x1=\"3.5\" y1=\"8\" x2=\"12.5\" y2=\"8\" />\n </svg>\n </span>\n {(label || description) && (\n <span className=\"ik-cb-textwrap\">\n {label && <span className=\"ik-cb-text\">{label}</span>}\n {description && <span className=\"ik-cb-desc\">{description}</span>}\n </span>\n )}\n </label>\n );\n}\n","import {\n Children,\n cloneElement,\n isValidElement,\n useId,\n useState,\n type InputHTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Radio.css';\n\nexport type RadioSize = 's' | 'm';\n\nexport interface RadioProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'> {\n value: string;\n size?: RadioSize;\n label?: ReactNode;\n description?: ReactNode;\n}\n\n/** Radio — single radio button (usually rendered by RadioGroup). */\nexport function Radio({\n value,\n checked,\n defaultChecked,\n name,\n disabled = false,\n size = 'm',\n label,\n description,\n onChange,\n id,\n className,\n ...rest\n}: RadioProps) {\n const autoId = useId();\n const inputId = id ?? `ik-rd-${autoId}`;\n return (\n <label\n className={cx('ik-rd', `ik-rd-${size}`, disabled && 'is-disabled', className)}\n htmlFor={inputId}\n >\n <input\n id={inputId}\n type=\"radio\"\n className=\"ik-rd-input\"\n value={value}\n name={name}\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled}\n onChange={onChange}\n {...rest}\n />\n <span className=\"ik-rd-circle\" aria-hidden=\"true\">\n <span className=\"ik-rd-dot\" />\n </span>\n {(label || description) && (\n <span className=\"ik-rd-textwrap\">\n {label && <span className=\"ik-rd-text\">{label}</span>}\n {description && <span className=\"ik-rd-desc\">{description}</span>}\n </span>\n )}\n </label>\n );\n}\n\nexport interface RadioOption {\n value: string;\n label?: ReactNode;\n description?: ReactNode;\n disabled?: boolean;\n}\n\nexport interface RadioGroupProps {\n name?: string;\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n options?: RadioOption[];\n size?: RadioSize;\n orientation?: 'vertical' | 'horizontal';\n disabled?: boolean;\n className?: string;\n children?: ReactNode;\n}\n\n/** RadioGroup — manages single selection across its Radios. Controlled or uncontrolled. */\nexport function RadioGroup({\n name,\n value,\n defaultValue,\n onChange,\n options,\n size = 'm',\n orientation = 'vertical',\n disabled = false,\n className,\n children,\n}: RadioGroupProps) {\n const autoName = useId();\n const groupName = name ?? `ik-rdg-${autoName}`;\n const controlled = value != null;\n const [internal, setInternal] = useState(defaultValue);\n const current = controlled ? value : internal;\n\n const handle = (v: string) => {\n if (!controlled) setInternal(v);\n onChange?.(v);\n };\n\n return (\n <div className={cx('ik-rdg', `ik-rdg-${orientation}`, className)} role=\"radiogroup\">\n {options\n ? options.map((opt) => (\n <Radio\n key={opt.value}\n name={groupName}\n size={size}\n value={opt.value}\n label={opt.label}\n description={opt.description}\n disabled={disabled || opt.disabled}\n checked={current === opt.value}\n onChange={() => handle(opt.value)}\n />\n ))\n : Children.map(children, (child) => {\n if (!isValidElement<RadioProps>(child)) return child;\n return cloneElement(child as ReactElement<RadioProps>, {\n name: groupName,\n size: child.props.size ?? size,\n checked: current === child.props.value,\n disabled: disabled || child.props.disabled,\n onChange: () => handle(child.props.value),\n });\n })}\n </div>\n );\n}\n","import { useId, type InputHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Switch.css';\n\nexport type SwitchSize = 's' | 'm';\n\nexport interface SwitchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'type'> {\n size?: SwitchSize;\n label?: ReactNode;\n description?: ReactNode;\n}\n\n/** Switch — on/off toggle. Semantically a `role=\"switch\"` checkbox, not a checkbox skin. */\nexport function Switch({\n checked,\n defaultChecked,\n disabled = false,\n size = 'm',\n label,\n description,\n onChange,\n id,\n className,\n ...rest\n}: SwitchProps) {\n const autoId = useId();\n const inputId = id ?? `ik-sw-${autoId}`;\n return (\n <label\n className={cx('ik-sw', `ik-sw-${size}`, disabled && 'is-disabled', className)}\n htmlFor={inputId}\n >\n <input\n id={inputId}\n type=\"checkbox\"\n role=\"switch\"\n className=\"ik-sw-input\"\n checked={checked}\n defaultChecked={defaultChecked}\n disabled={disabled}\n onChange={onChange}\n {...rest}\n />\n <span className=\"ik-sw-track\" aria-hidden=\"true\">\n <span className=\"ik-sw-knob\" />\n </span>\n {(label || description) && (\n <span className=\"ik-sw-textwrap\">\n {label && <span className=\"ik-sw-text\">{label}</span>}\n {description && <span className=\"ik-sw-desc\">{description}</span>}\n </span>\n )}\n </label>\n );\n}\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Badge.css';\n\nexport type BadgeVariant = 'success' | 'warning' | 'error' | 'info' | 'accent' | 'neutral';\nexport type BadgeSize = 's' | 'm';\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n variant?: BadgeVariant;\n size?: BadgeSize;\n /** Show a leading status dot. */\n dot?: boolean;\n icon?: ReactNode;\n}\n\n/** Badge — informational status pill. Not interactive by default. */\nexport function Badge({\n variant = 'neutral',\n size = 'm',\n dot = false,\n icon,\n children,\n className,\n ...rest\n}: BadgeProps) {\n return (\n <span className={cx('ik-bdg', `ik-bdg-${size}`, `ik-bdg-${variant}`, className)} {...rest}>\n {dot && <span className=\"ik-bdg-dot\" aria-hidden=\"true\" />}\n {icon}\n {children}\n </span>\n );\n}\n\nexport interface TagProps extends HTMLAttributes<HTMLSpanElement> {\n accent?: boolean;\n onRemove?: () => void;\n removeLabel?: string;\n}\n\n/** Tag — mono technical label, optionally removable (chip). */\nexport function Tag({\n accent = false,\n onRemove,\n removeLabel = 'Удалить',\n children,\n className,\n ...rest\n}: TagProps) {\n return (\n <span className={cx('ik-tag', accent && 'ik-tag-accent', className)} {...rest}>\n {children}\n {onRemove && (\n <button type=\"button\" className=\"ik-tag-x\" onClick={onRemove} aria-label={removeLabel}>\n <svg\n width=\"9\"\n height=\"9\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"4\" y1=\"4\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"4\" x2=\"4\" y2=\"12\" />\n </svg>\n </button>\n )}\n </span>\n );\n}\n","import { useState, type HTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Avatar.css';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg';\nexport type AvatarShape = 'circle' | 'square';\nexport type AvatarStatus = 'online' | 'warn' | 'off' | 'error';\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n /** Display name — used for the accessible label and initials fallback. */\n name?: string;\n src?: string;\n size?: AvatarSize;\n shape?: AvatarShape;\n status?: AvatarStatus;\n}\n\nfunction initials(name?: string): string {\n if (!name) return '?';\n const parts = name.trim().split(/\\s+/).slice(0, 2);\n return parts.map((p) => p[0] ?? '').join('') || '?';\n}\n\n/** Avatar — user/device representation with image or initials fallback + status dot. */\nexport function Avatar({\n name,\n src,\n size = 'md',\n shape = 'circle',\n status,\n className,\n ...rest\n}: AvatarProps) {\n const [failed, setFailed] = useState(false);\n const showImg = src && !failed;\n return (\n <span\n className={cx('ik-av', `ik-av-${size}`, `ik-av-${shape}`, className)}\n role=\"img\"\n aria-label={name}\n {...rest}\n >\n {showImg ? (\n <img className=\"ik-av-img\" src={src} alt=\"\" onError={() => setFailed(true)} />\n ) : (\n <span aria-hidden=\"true\">{initials(name)}</span>\n )}\n {status && (\n <span className={cx('ik-av-status', `ik-av-status-${status}`)} aria-hidden=\"true\" />\n )}\n </span>\n );\n}\n","import { forwardRef, type HTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Card.css';\n\nexport type CardPadding = 'none' | 's' | 'm' | 'l';\n\nexport interface CardProps extends HTMLAttributes<HTMLDivElement> {\n padding?: CardPadding;\n elevated?: boolean;\n /** Hoverable/focusable affordance. Set `onClick` and an accessible name. */\n interactive?: boolean;\n selected?: boolean;\n}\n\n/** Card — surface container. Use Card.Header / Card.Body / Card.Footer for structured content. */\nexport const Card = forwardRef<HTMLDivElement, CardProps>(function Card(\n { padding = 'm', elevated = false, interactive = false, selected = false, className, ...rest },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cx(\n 'ik-card',\n `ik-card-pad-${padding}`,\n elevated && 'ik-card-elevated',\n interactive && 'ik-card-interactive',\n selected && 'ik-card-selected',\n className,\n )}\n tabIndex={interactive ? 0 : undefined}\n {...rest}\n />\n );\n}) as React.ForwardRefExoticComponent<CardProps & React.RefAttributes<HTMLDivElement>> & {\n Header: typeof CardHeader;\n Body: typeof CardBody;\n Footer: typeof CardFooter;\n};\n\nfunction CardHeader({ className, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cx('ik-card-header', className)} {...rest} />;\n}\nfunction CardBody({ className, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cx('ik-card-body', className)} {...rest} />;\n}\nfunction CardFooter({ className, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return <div className={cx('ik-card-footer', className)} {...rest} />;\n}\n\nCard.Header = CardHeader;\nCard.Body = CardBody;\nCard.Footer = CardFooter;\n","import { type CSSProperties, type HTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Skeleton.css';\n\nexport type SkeletonVariant = 'text' | 'rect' | 'circle';\n\nexport interface SkeletonProps extends HTMLAttributes<HTMLDivElement> {\n variant?: SkeletonVariant;\n width?: number | string;\n height?: number | string;\n /** For variant=\"text\": number of lines to render. */\n lines?: number;\n animated?: boolean;\n}\n\nconst dim = (v: number | string | undefined): string | undefined =>\n v == null ? undefined : typeof v === 'number' ? `${v}px` : v;\n\n/** Skeleton — content placeholder shown while data loads. Decorative (aria-hidden). */\nexport function Skeleton({\n variant = 'text',\n width,\n height,\n lines = 1,\n animated = true,\n className,\n style,\n ...rest\n}: SkeletonProps) {\n const base = cx('ik-sk', `ik-sk-${variant}`, animated && 'ik-sk-animated', className);\n\n if (variant === 'text' && lines > 1) {\n return (\n <div className=\"ik-sk-lines\" aria-hidden=\"true\" {...rest}>\n {Array.from({ length: lines }).map((_, i) => (\n <span\n key={i}\n className={base}\n style={{ width: i === lines - 1 ? '60%' : (dim(width) ?? '100%'), ...style }}\n />\n ))}\n </div>\n );\n }\n\n const css: CSSProperties = { width: dim(width), height: dim(height), ...style };\n return <div className={base} style={css} aria-hidden=\"true\" {...rest} />;\n}\n","import { type HTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Spinner.css';\n\nexport type SpinnerSize = 's' | 'm' | 'l';\n\nexport interface SpinnerProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n size?: SpinnerSize;\n /** Accessible label announced to screen readers. */\n label?: string;\n}\n\n/** Spinner — indeterminate loading indicator with an accessible label. */\nexport function Spinner({ size = 'm', label = 'Загрузка…', className, ...rest }: SpinnerProps) {\n return (\n <div role=\"status\" aria-live=\"polite\" className={cx('ik-spinner-wrap', className)} {...rest}>\n <span className={cx('ik-spinner', `ik-spinner-${size}`)} aria-hidden=\"true\" />\n <span className=\"ik-spinner-label\">{label}</span>\n </div>\n );\n}\n","import { cloneElement, useId, type ReactElement, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './FormField.css';\n\ninterface ControlAriaProps {\n id?: string;\n 'aria-describedby'?: string;\n 'aria-invalid'?: boolean;\n 'aria-required'?: boolean;\n}\n\nexport interface FormFieldProps {\n label?: ReactNode;\n hint?: ReactNode;\n error?: ReactNode | boolean;\n required?: boolean;\n /** Provide an explicit id; otherwise one is generated and wired to the control. */\n id?: string;\n /** A single form control. Receives id + aria-* automatically. */\n children: ReactElement<ControlAriaProps>;\n className?: string;\n}\n\n/**\n * FormField — labels a single control and wires `htmlFor`, `aria-describedby`,\n * `aria-invalid` and `aria-required`. Pairs with raw inputs or any control that\n * forwards id/aria props.\n */\nexport function FormField({\n label,\n hint,\n error,\n required = false,\n id,\n children,\n className,\n}: FormFieldProps) {\n const autoId = useId();\n const fieldId = id ?? children.props.id ?? `ik-ff-${autoId}`;\n const msgId = `${fieldId}-msg`;\n const errText = typeof error === 'string' ? error : null;\n const isError = Boolean(error);\n const hasMsg = Boolean(errText || hint);\n\n const control = cloneElement(children, {\n id: fieldId,\n 'aria-describedby': hasMsg ? msgId : children.props['aria-describedby'],\n 'aria-invalid': isError || children.props['aria-invalid'],\n 'aria-required': required || children.props['aria-required'],\n });\n\n return (\n <div className={cx('ik-ff', className)}>\n {label && (\n <label className=\"ik-ff-label\" htmlFor={fieldId}>\n {label}\n {required && (\n <span className=\"ik-ff-req\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n )}\n {control}\n {hasMsg && (\n <div id={msgId} className={cx('ik-ff-msg', isError && 'is-error')}>\n {errText || hint}\n </div>\n )}\n </div>\n );\n}\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { Icon, type IconName } from '../Icon/Icon.js';\nimport { cx } from '../../utils/cx.js';\nimport './Alert.css';\n\nexport type AlertVariant = 'info' | 'success' | 'warning' | 'error';\n\nconst DEFAULT_ICON: Record<AlertVariant, IconName> = {\n info: 'info',\n success: 'check-circle',\n warning: 'warning',\n error: 'x-circle',\n};\n\nexport interface AlertProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n variant?: AlertVariant;\n title?: ReactNode;\n /** Replace the default status icon (or pass null to hide it). */\n icon?: ReactNode | null;\n closable?: boolean;\n onClose?: () => void;\n closeLabel?: string;\n}\n\n/**\n * Alert — inline contextual message. Errors/warnings announce assertively\n * (`role=\"alert\"`); info/success use a polite `role=\"status\"`.\n */\nexport function Alert({\n variant = 'info',\n title,\n icon,\n closable = false,\n onClose,\n closeLabel = 'Закрыть',\n children,\n className,\n ...rest\n}: AlertProps) {\n const role = variant === 'error' || variant === 'warning' ? 'alert' : 'status';\n const showIcon = icon !== null;\n return (\n <div className={cx('ik-alert', `ik-alert-${variant}`, className)} role={role} {...rest}>\n {showIcon && (\n <span className=\"ik-alert-ico\" aria-hidden=\"true\">\n {icon ?? <Icon name={DEFAULT_ICON[variant]} size={16} />}\n </span>\n )}\n <div className=\"ik-alert-body\">\n {title && <div className=\"ik-alert-title\">{title}</div>}\n {children}\n </div>\n {closable && (\n <button type=\"button\" className=\"ik-alert-close\" onClick={onClose} aria-label={closeLabel}>\n <Icon name=\"close\" size={14} />\n </button>\n )}\n </div>\n );\n}\n","import { type HTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './EmptyState.css';\n\nexport interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n icon?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n /** Primary action (usually a Button). */\n action?: ReactNode;\n}\n\n/** EmptyState — zero-data placeholder with optional icon, copy and a call to action. */\nexport function EmptyState({\n icon,\n title,\n description,\n action,\n className,\n ...rest\n}: EmptyStateProps) {\n return (\n <div className={cx('ik-empty', className)} {...rest}>\n {icon && (\n <span className=\"ik-empty-ico\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <div className=\"ik-empty-title\">{title}</div>\n {description && <div className=\"ik-empty-desc\">{description}</div>}\n {action && <div className=\"ik-empty-action\">{action}</div>}\n </div>\n );\n}\n","import { useEffect, type RefObject } from 'react';\n\nconst FOCUSABLE =\n 'a[href],button:not([disabled]),textarea:not([disabled]),input:not([disabled]),select:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Traps Tab focus inside `ref` while `active`. On activate it focuses the first\n * focusable element (or the container); on deactivate it restores focus to the\n * element that was focused before. Used by Modal/Dialog.\n */\nexport function useFocusTrap(ref: RefObject<HTMLElement | null>, active: boolean): void {\n useEffect(() => {\n if (!active || !ref.current) return;\n const root = ref.current;\n const previouslyFocused = document.activeElement as HTMLElement | null;\n\n const focusable = () => Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE));\n const first = focusable()[0];\n (first ?? root).focus();\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n const items = focusable();\n if (items.length === 0) {\n e.preventDefault();\n return;\n }\n const firstEl = items[0]!;\n const lastEl = items[items.length - 1]!;\n const activeEl = document.activeElement;\n if (e.shiftKey && activeEl === firstEl) {\n e.preventDefault();\n lastEl.focus();\n } else if (!e.shiftKey && activeEl === lastEl) {\n e.preventDefault();\n firstEl.focus();\n }\n };\n\n root.addEventListener('keydown', onKeyDown);\n return () => {\n root.removeEventListener('keydown', onKeyDown);\n previouslyFocused?.focus?.();\n };\n }, [active, ref]);\n}\n","import { useEffect, useRef, type MouseEvent, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useFocusTrap } from '../../utils/useFocusTrap.js';\nimport { cx } from '../../utils/cx.js';\nimport './Modal.css';\n\nexport type ModalSize = 's' | 'm' | 'l';\n\nexport interface ModalProps {\n open: boolean;\n onClose: () => void;\n title?: ReactNode;\n description?: ReactNode;\n children?: ReactNode;\n footer?: ReactNode;\n size?: ModalSize;\n closeOnEsc?: boolean;\n closeOnOverlayClick?: boolean;\n showClose?: boolean;\n closeLabel?: string;\n className?: string;\n}\n\n/**\n * Modal — accessible dialog rendered in a portal. Implements the WAI-ARIA dialog\n * pattern: `role=\"dialog\"`, `aria-modal`, focus trap, Esc to close, focus\n * restoration, and an `aria-labelledby`/`aria-describedby` association.\n */\nexport function Modal({\n open,\n onClose,\n title,\n description,\n children,\n footer,\n size = 'm',\n closeOnEsc = true,\n closeOnOverlayClick = true,\n showClose = true,\n closeLabel = 'Закрыть',\n className,\n}: ModalProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n useFocusTrap(dialogRef, open);\n\n useEffect(() => {\n if (!open || !closeOnEsc) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [open, closeOnEsc, onClose]);\n\n useEffect(() => {\n if (!open) return;\n const prev = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = prev;\n };\n }, [open]);\n\n if (!open || typeof document === 'undefined') return null;\n\n const titleId = title ? 'ik-modal-title' : undefined;\n const descId = description ? 'ik-modal-desc' : undefined;\n\n const onOverlayMouseDown = (e: MouseEvent<HTMLDivElement>) => {\n if (closeOnOverlayClick && e.target === e.currentTarget) onClose();\n };\n\n return createPortal(\n <div className=\"ik-modal-overlay\" onMouseDown={onOverlayMouseDown}>\n <div\n ref={dialogRef}\n className={cx('ik-modal', `ik-modal-${size}`, className)}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descId}\n tabIndex={-1}\n >\n {(title || showClose) && (\n <div className=\"ik-modal-header\">\n <div className=\"ik-modal-titles\">\n {title && (\n <div id={titleId} className=\"ik-modal-title\">\n {title}\n </div>\n )}\n {description && (\n <div id={descId} className=\"ik-modal-desc\">\n {description}\n </div>\n )}\n </div>\n {showClose && (\n <button\n type=\"button\"\n className=\"ik-modal-close\"\n onClick={onClose}\n aria-label={closeLabel}\n >\n <svg\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"4\" y1=\"4\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"4\" x2=\"4\" y2=\"12\" />\n </svg>\n </button>\n )}\n </div>\n )}\n {children != null && <div className=\"ik-modal-body\">{children}</div>}\n {footer && <div className=\"ik-modal-footer\">{footer}</div>}\n </div>\n </div>,\n document.body,\n );\n}\n","/** Canonical `KeyboardEvent.key` values used across the design system. */\nexport const Keys = {\n Enter: 'Enter',\n Space: ' ',\n Escape: 'Escape',\n Tab: 'Tab',\n ArrowUp: 'ArrowUp',\n ArrowDown: 'ArrowDown',\n ArrowLeft: 'ArrowLeft',\n ArrowRight: 'ArrowRight',\n Home: 'Home',\n End: 'End',\n};\n/** True for keys that should activate a button/option (Enter or Space). */\nexport function isActivationKey(key) {\n return key === Keys.Enter || key === Keys.Space;\n}\n//# sourceMappingURL=keyboard.js.map","import { Keys } from './keyboard.js';\n/** Build stable tab/panel id helpers from a base id (for `aria-controls`/`aria-labelledby`). */\nexport function createTabsIds(baseId) {\n return {\n tab: (value) => `${baseId}-tab-${value}`,\n panel: (value) => `${baseId}-panel-${value}`,\n };\n}\n/** First non-disabled value — the sensible default selection. */\nexport function firstEnabledValue(items) {\n return items.find((i) => !i.disabled)?.value;\n}\n/**\n * Pure roving-tabindex resolver for the Tabs pattern. Given the currently\n * focused value and a key, returns the value that should receive focus next,\n * or `undefined` if the key is not a navigation key. Disabled tabs are skipped\n * and navigation wraps around.\n */\nexport function getNextTabValue(items, currentValue, key, orientation = 'horizontal') {\n const enabled = items.filter((i) => !i.disabled);\n if (enabled.length === 0)\n return undefined;\n const nextKey = orientation === 'horizontal' ? Keys.ArrowRight : Keys.ArrowDown;\n const prevKey = orientation === 'horizontal' ? Keys.ArrowLeft : Keys.ArrowUp;\n const pos = enabled.findIndex((i) => i.value === currentValue);\n const safePos = pos === -1 ? 0 : pos;\n switch (key) {\n case nextKey:\n return enabled[(safePos + 1) % enabled.length].value;\n case prevKey:\n return enabled[(safePos - 1 + enabled.length) % enabled.length].value;\n case Keys.Home:\n return enabled[0].value;\n case Keys.End:\n return enabled[enabled.length - 1].value;\n default:\n return undefined;\n }\n}\n//# sourceMappingURL=tabs.js.map","import { useId, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { createTabsIds, firstEnabledValue, getNextTabValue } from '@iskra-ui/core';\nimport { cx } from '../../utils/cx.js';\nimport './Tabs.css';\n\nexport interface TabItem {\n value: string;\n label: ReactNode;\n content: ReactNode;\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n items: TabItem[];\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n className?: string;\n 'aria-label'?: string;\n}\n\n/**\n * Tabs — WAI-ARIA Tabs pattern. Roving tabindex on the tablist with\n * Left/Right/Home/End navigation; only the active tab is in the tab order.\n */\nexport function Tabs({\n items,\n value,\n defaultValue,\n onValueChange,\n className,\n 'aria-label': ariaLabel,\n}: TabsProps) {\n const baseId = useId();\n const ids = createTabsIds(baseId);\n const controlled = value != null;\n const [internal, setInternal] = useState(defaultValue ?? firstEnabledValue(items));\n const current = controlled ? value : internal;\n const tabRefs = useRef<Record<string, HTMLButtonElement | null>>({});\n\n const select = (v: string) => {\n if (!controlled) setInternal(v);\n onValueChange?.(v);\n };\n\n const onKeyDown = (e: KeyboardEvent<HTMLButtonElement>, index: number) => {\n const nextValue = getNextTabValue(items, items[index]!.value, e.key);\n if (nextValue) {\n e.preventDefault();\n select(nextValue);\n tabRefs.current[nextValue]?.focus();\n }\n };\n\n return (\n <div className={cx('ik-tabs', className)}>\n <div className=\"ik-tabs-list\" role=\"tablist\" aria-label={ariaLabel}>\n {items.map((item, i) => {\n const selected = item.value === current;\n return (\n <button\n key={item.value}\n ref={(el) => {\n tabRefs.current[item.value] = el;\n }}\n type=\"button\"\n role=\"tab\"\n id={ids.tab(item.value)}\n aria-selected={selected}\n aria-controls={ids.panel(item.value)}\n tabIndex={selected ? 0 : -1}\n disabled={item.disabled}\n className=\"ik-tabs-tab\"\n onClick={() => select(item.value)}\n onKeyDown={(e) => onKeyDown(e, i)}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n {items.map((item) => (\n <div\n key={item.value}\n role=\"tabpanel\"\n id={ids.panel(item.value)}\n aria-labelledby={ids.tab(item.value)}\n hidden={item.value !== current}\n tabIndex={0}\n className=\"ik-tabs-panel\"\n >\n {item.value === current && item.content}\n </div>\n ))}\n </div>\n );\n}\n","import { type ReactNode } from 'react';\nimport { Skeleton } from '../Skeleton/Skeleton.js';\nimport { cx } from '../../utils/cx.js';\nimport './Table.css';\n\nexport type TableDensity = 'regular' | 'compact';\nexport type TableAlign = 'left' | 'right' | 'center';\n\nexport interface TableColumn<T> {\n /** Unique column key; also used to read `row[key]` when no `render` is given. */\n key: string;\n header: ReactNode;\n render?: (row: T, index: number) => ReactNode;\n align?: TableAlign;\n width?: number | string;\n}\n\nexport interface TableProps<T> {\n columns: TableColumn<T>[];\n data: T[];\n /** Stable row id; defaults to the row index. */\n getRowId?: (row: T, index: number) => string | number;\n density?: TableDensity;\n stickyHeader?: boolean;\n loading?: boolean;\n /** Number of skeleton rows while loading. */\n loadingRows?: number;\n /** Shown when `data` is empty and not loading. */\n empty?: ReactNode;\n onRowClick?: (row: T, index: number) => void;\n selectedRowId?: string | number;\n /** Visually-hidden caption for screen readers. */\n caption?: string;\n className?: string;\n}\n\nconst alignClass = (a?: TableAlign) =>\n a === 'right' ? 'ik-table-align-right' : a === 'center' ? 'ik-table-align-center' : undefined;\n\n/** Table — foundational data table. Not a virtualized data-grid; see roadmap. */\nexport function Table<T>({\n columns,\n data,\n getRowId,\n density = 'regular',\n stickyHeader = false,\n loading = false,\n loadingRows = 5,\n empty,\n onRowClick,\n selectedRowId,\n caption,\n className,\n}: TableProps<T>) {\n const colCount = columns.length;\n const rowId = (row: T, i: number) => getRowId?.(row, i) ?? i;\n\n return (\n <div className=\"ik-table-wrap\">\n <table\n className={cx(\n 'ik-table',\n `ik-table-${density}`,\n stickyHeader && 'ik-table-sticky',\n className,\n )}\n >\n {caption && <caption>{caption}</caption>}\n <thead>\n <tr>\n {columns.map((c) => (\n <th\n key={c.key}\n scope=\"col\"\n className={alignClass(c.align)}\n style={{ width: c.width }}\n >\n {c.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {loading ? (\n Array.from({ length: loadingRows }).map((_, r) => (\n <tr key={`sk-${r}`}>\n {columns.map((c) => (\n <td key={c.key} className={alignClass(c.align)}>\n <Skeleton variant=\"text\" />\n </td>\n ))}\n </tr>\n ))\n ) : data.length === 0 ? (\n <tr>\n <td className=\"ik-table-state\" colSpan={colCount}>\n {empty}\n </td>\n </tr>\n ) : (\n data.map((row, i) => {\n const id = rowId(row, i);\n return (\n <tr\n key={id}\n className={cx(\n onRowClick && 'ik-table-row-clickable',\n selectedRowId != null && selectedRowId === id && 'ik-table-row-selected',\n )}\n aria-selected={selectedRowId != null ? selectedRowId === id : undefined}\n onClick={onRowClick ? () => onRowClick(row, i) : undefined}\n >\n {columns.map((c) => (\n <td key={c.key} className={alignClass(c.align)}>\n {c.render\n ? c.render(row, i)\n : ((row as Record<string, ReactNode>)[c.key] ?? null)}\n </td>\n ))}\n </tr>\n );\n })\n )}\n </tbody>\n </table>\n </div>\n );\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { cx } from '../../utils/cx.js';\nimport './Toast.css';\n\nexport type ToastVariant = 'info' | 'success' | 'warning' | 'error';\n\nexport interface ToastOptions {\n title?: ReactNode;\n description?: ReactNode;\n variant?: ToastVariant;\n /** Auto-dismiss delay in ms. 0 keeps it until dismissed. Default 5000. */\n duration?: number;\n action?: ReactNode;\n closeLabel?: string;\n}\n\ninterface ToastRecord extends ToastOptions {\n id: string;\n}\n\ninterface ToastContextValue {\n toast: (opts: ToastOptions) => string;\n dismiss: (id: string) => void;\n}\n\nconst ToastContext = createContext<ToastContextValue | null>(null);\n\nlet counter = 0;\n\n/** ToastProvider — owns the toast queue and renders the viewport. Wrap your app once. */\nexport function ToastProvider({ children }: { children: ReactNode }) {\n const [toasts, setToasts] = useState<ToastRecord[]>([]);\n const timers = useRef<Record<string, ReturnType<typeof setTimeout>>>({});\n\n const dismiss = useCallback((id: string) => {\n setToasts((list) => list.filter((t) => t.id !== id));\n const timer = timers.current[id];\n if (timer) {\n clearTimeout(timer);\n delete timers.current[id];\n }\n }, []);\n\n const toast = useCallback(\n (opts: ToastOptions) => {\n const id = `ik-toast-${++counter}`;\n const duration = opts.duration ?? 5000;\n setToasts((list) => [...list, { ...opts, id }]);\n if (duration > 0) {\n timers.current[id] = setTimeout(() => dismiss(id), duration);\n }\n return id;\n },\n [dismiss],\n );\n\n useEffect(() => {\n const t = timers.current;\n return () => {\n Object.values(t).forEach(clearTimeout);\n };\n }, []);\n\n const ctx = useMemo(() => ({ toast, dismiss }), [toast, dismiss]);\n\n return (\n <ToastContext.Provider value={ctx}>\n {children}\n {typeof document !== 'undefined' &&\n createPortal(\n <div className=\"ik-toast-viewport\" role=\"region\" aria-label=\"Уведомления\">\n {toasts.map((t) => (\n <ToastItem key={t.id} toast={t} onClose={() => dismiss(t.id)} />\n ))}\n </div>,\n document.body,\n )}\n </ToastContext.Provider>\n );\n}\n\n/** useToast — imperative API: `const { toast, dismiss } = useToast()`. */\nexport function useToast(): ToastContextValue {\n const ctx = useContext(ToastContext);\n if (!ctx) throw new Error('useToast must be used within a <ToastProvider>');\n return ctx;\n}\n\nfunction ToastItem({ toast, onClose }: { toast: ToastRecord; onClose: () => void }) {\n const { title, description, variant = 'info', action, closeLabel = 'Закрыть' } = toast;\n const role = variant === 'error' || variant === 'warning' ? 'alert' : 'status';\n return (\n <div className={cx('ik-toast', `ik-toast-${variant}`)} role={role}>\n <div className=\"ik-toast-body\">\n {title && <div className=\"ik-toast-title\">{title}</div>}\n {description && <div className=\"ik-toast-desc\">{description}</div>}\n {action && <div className=\"ik-toast-action\">{action}</div>}\n </div>\n <button type=\"button\" className=\"ik-toast-close\" onClick={onClose} aria-label={closeLabel}>\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"4\" y1=\"4\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"4\" x2=\"4\" y2=\"12\" />\n </svg>\n </button>\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState, type MouseEvent } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Sidebar.css';\n\nexport type SidebarVariant = 'operator' | 'admin';\nexport type SidebarTheme = '' | 'theme-cold' | 'theme-warm';\n\nexport interface SidebarProps {\n /** Icon-only narrow mode (52px). */\n collapsed?: boolean;\n /** Flip `collapsed` in host state. */\n onToggle?: () => void;\n /** Highlights item + sets aria-current. */\n activeItem?: string;\n /** Called on item click. */\n onNavigate?: (id: string) => void;\n /** Admin adds Пользователи / Аудит / Система. */\n variant?: SidebarVariant;\n /** Theme scope class (dark by default). */\n theme?: SidebarTheme;\n /** Numeric badges keyed by nav item id, e.g. { alerts: 3 }. */\n badges?: Record<string, number>;\n className?: string;\n}\n\ntype IconId =\n | 'overview'\n | 'devices'\n | 'topology'\n | 'alerts'\n | 'apikeys'\n | 'log'\n | 'settings'\n | 'users'\n | 'audit'\n | 'system'\n | 'logout';\n\ninterface NavItem {\n id: string;\n lbl: string;\n ico: IconId;\n}\ninterface NavGroup {\n id: string;\n lbl: string;\n items: NavItem[];\n}\n\nconst ICON_PROPS = {\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n viewBox: '0 0 16 16',\n width: 16,\n height: 16,\n 'aria-hidden': true,\n};\n\nfunction NavIcon({ id }: { id: IconId }) {\n const p = ICON_PROPS;\n switch (id) {\n case 'overview':\n return (\n <svg {...p}>\n <rect x=\"2\" y=\"2\" width=\"5\" height=\"5\" rx=\"1\" />\n <rect x=\"9\" y=\"2\" width=\"5\" height=\"5\" rx=\"1\" />\n <rect x=\"2\" y=\"9\" width=\"5\" height=\"5\" rx=\"1\" />\n <rect x=\"9\" y=\"9\" width=\"5\" height=\"5\" rx=\"1\" />\n </svg>\n );\n case 'devices':\n return (\n <svg {...p}>\n <rect x=\"1.5\" y=\"3\" width=\"13\" height=\"4\" rx=\"1\" />\n <rect x=\"1.5\" y=\"9\" width=\"13\" height=\"4\" rx=\"1\" />\n <circle cx=\"12.5\" cy=\"5\" r=\".85\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12.5\" cy=\"11\" r=\".85\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n );\n case 'topology':\n return (\n <svg {...p}>\n <circle cx=\"8\" cy=\"3\" r=\"1.5\" />\n <circle cx=\"2.5\" cy=\"12.5\" r=\"1.5\" />\n <circle cx=\"13.5\" cy=\"12.5\" r=\"1.5\" />\n <line x1=\"8\" y1=\"4.5\" x2=\"3.3\" y2=\"11.2\" />\n <line x1=\"8\" y1=\"4.5\" x2=\"12.7\" y2=\"11.2\" />\n <line x1=\"4\" y1=\"12.5\" x2=\"12\" y2=\"12.5\" />\n </svg>\n );\n case 'alerts':\n return (\n <svg {...p}>\n <path d=\"M8 2a4 4 0 0 1 4 4c0 2.5 1 3.5 1 3.5H3S4 9.5 4 6a4 4 0 0 1 4-4z\" />\n <path d=\"M6.5 9.5a1.5 1.5 0 0 0 3 0\" />\n </svg>\n );\n case 'apikeys':\n return (\n <svg {...p}>\n <circle cx=\"5.5\" cy=\"8\" r=\"3\" />\n <path d=\"M8.5 8h5.5m-2.5-1.5v3\" />\n </svg>\n );\n case 'log':\n return (\n <svg {...p}>\n <line x1=\"3\" y1=\"4.5\" x2=\"13\" y2=\"4.5\" />\n <line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" />\n <line x1=\"3\" y1=\"11.5\" x2=\"9\" y2=\"11.5\" />\n </svg>\n );\n case 'settings':\n return (\n <svg {...p}>\n <line x1=\"3\" y1=\"4\" x2=\"13\" y2=\"4\" />\n <line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" />\n <line x1=\"3\" y1=\"12\" x2=\"13\" y2=\"12\" />\n <circle cx=\"6\" cy=\"4\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"10\" cy=\"8\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"7\" cy=\"12\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n );\n case 'users':\n return (\n <svg {...p}>\n <circle cx=\"6\" cy=\"6\" r=\"2.5\" />\n <path d=\"M1 14c0-3 2.5-4.5 5-4.5s5 1.5 5 4.5\" />\n <path d=\"M11 4.5a2 2 0 0 1 0 3.5\" />\n <path d=\"M13.5 14c0-2-1.2-3.5-2.5-4\" />\n </svg>\n );\n case 'audit':\n return (\n <svg {...p}>\n <path d=\"M8 1.5 13.5 3.5V8c0 3.5-2.5 5.5-5.5 6.5-3-1-5.5-3-5.5-6.5V3.5Z\" />\n <polyline points=\"5.5,8 7,9.5 10.5,6\" />\n </svg>\n );\n case 'system':\n return (\n <svg {...p}>\n <rect x=\"1.5\" y=\"2.5\" width=\"13\" height=\"11\" rx=\"1.5\" />\n <polyline points=\"4.5,6.5 7,9 4.5,11.5\" />\n <line x1=\"8.5\" y1=\"11.5\" x2=\"11.5\" y2=\"11.5\" />\n </svg>\n );\n case 'logout':\n return (\n <svg {...p}>\n <path d=\"M6 3H3a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h3\" />\n <polyline points=\"10,5.5 13.5,8 10,10.5\" />\n <line x1=\"6\" y1=\"8\" x2=\"13.5\" y2=\"8\" />\n </svg>\n );\n default:\n return (\n <svg {...p}>\n <circle cx=\"8\" cy=\"8\" r=\"5\" />\n </svg>\n );\n }\n}\n\nfunction Spark() {\n return (\n <svg viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\" width=\"20\" height=\"20\">\n <path d=\"M10 1 12.6 7.8 19.5 9.8 12.6 11.9 10 18.7 7.4 11.9.5 9.8 7.4 7.8Z\" />\n </svg>\n );\n}\n\nconst OPERATOR_NAV: NavGroup[] = [\n {\n id: 'monitoring',\n lbl: 'Мониторинг',\n items: [\n { id: 'overview', lbl: 'Обзор', ico: 'overview' },\n { id: 'devices', lbl: 'Устройства', ico: 'devices' },\n { id: 'topology', lbl: 'Топология', ico: 'topology' },\n ],\n },\n {\n id: 'management',\n lbl: 'Управление',\n items: [\n { id: 'alerts', lbl: 'Оповещения', ico: 'alerts' },\n { id: 'apikeys', lbl: 'API-ключи', ico: 'apikeys' },\n { id: 'log', lbl: 'Журнал', ico: 'log' },\n ],\n },\n];\n\nconst ADMIN_NAV: NavGroup[] = [\n ...OPERATOR_NAV,\n {\n id: 'admin',\n lbl: 'Администрирование',\n items: [\n { id: 'users', lbl: 'Пользователи', ico: 'users' },\n { id: 'audit', lbl: 'Аудит', ico: 'audit' },\n { id: 'system', lbl: 'Система', ico: 'system' },\n ],\n },\n];\n\nconst FOOTER_NAV: NavItem[] = [\n { id: 'settings', lbl: 'Настройки', ico: 'settings' },\n { id: 'logout', lbl: 'Выход', ico: 'logout' },\n];\n\ninterface ItemProps {\n item: NavItem;\n active: boolean;\n badge?: number;\n onHover?: (e: MouseEvent<HTMLButtonElement>, lbl: string) => void;\n onLeave?: () => void;\n onClick?: () => void;\n}\n\nfunction Item({ item, active, badge, onHover, onLeave, onClick }: ItemProps) {\n return (\n <button\n className={cx('isb-item', active && 'isb-on')}\n title={item.lbl}\n onMouseEnter={onHover ? (e) => onHover(e, item.lbl) : undefined}\n onMouseLeave={onLeave}\n onClick={onClick}\n type=\"button\"\n aria-current={active ? 'page' : undefined}\n >\n <span className=\"isb-ico\">\n <NavIcon id={item.ico} />\n </span>\n <span className=\"isb-lbl\">{item.lbl}</span>\n {badge != null && badge > 0 && (\n <span className=\"isb-bdg\" aria-label={`${item.lbl}: ${badge} уведомлений`}>\n {badge}\n </span>\n )}\n </button>\n );\n}\n\n/** Sidebar — shared navigation for operator and admin frontends. */\nexport function Sidebar({\n collapsed = false,\n onToggle,\n activeItem = 'overview',\n onNavigate,\n variant = 'operator',\n theme = '',\n badges = {},\n className = '',\n}: SidebarProps) {\n const [tip, setTip] = useState<{ lbl: string; top: number } | null>(null);\n const [tipRdy, setTipRdy] = useState(false);\n const [prevCollapsed, setPrevCollapsed] = useState(collapsed);\n const sbRef = useRef<HTMLElement>(null);\n\n if (collapsed !== prevCollapsed) {\n setPrevCollapsed(collapsed);\n setTipRdy(false);\n setTip(null);\n }\n\n useEffect(() => {\n if (!collapsed) return;\n const t = setTimeout(() => setTipRdy(true), 210);\n return () => clearTimeout(t);\n }, [collapsed]);\n\n const showTip = useCallback(\n (e: MouseEvent<HTMLButtonElement>, lbl: string) => {\n if (!tipRdy || !sbRef.current) return;\n const ir = e.currentTarget.getBoundingClientRect();\n const sr = sbRef.current.getBoundingClientRect();\n setTip({ lbl, top: ir.top - sr.top + ir.height / 2 });\n },\n [tipRdy],\n );\n\n const hideTip = useCallback(() => setTip(null), []);\n\n const sections = variant === 'admin' ? ADMIN_NAV : OPERATOR_NAV;\n const hover = collapsed ? { onHover: showTip, onLeave: hideTip } : {};\n\n return (\n <aside\n className={cx(\n 'iskra-sb',\n collapsed && 'isb-c',\n collapsed && tipRdy && 'isb-tip-rdy',\n theme,\n className,\n )}\n ref={sbRef}\n role=\"navigation\"\n aria-label=\"Навигация платформы\"\n >\n <div className=\"isb-logo\">\n <span className=\"isb-spark\">\n <Spark />\n </span>\n <span className=\"isb-wmark\">ИСКРА.DCI</span>\n <button\n className=\"isb-collapser\"\n type=\"button\"\n onClick={onToggle}\n aria-expanded={!collapsed}\n aria-label={collapsed ? 'Развернуть боковую панель' : 'Свернуть боковую панель'}\n >\n <svg\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"7,2 4,5 7,8\" />\n </svg>\n </button>\n </div>\n\n <div className=\"isb-scroll\">\n {sections.map(({ id, lbl, items }) => (\n <div key={id} className=\"isb-grp\">\n <div className=\"isb-sec\" aria-hidden=\"true\">\n {lbl}\n </div>\n {items.map((item) => (\n <Item\n key={item.id}\n item={item}\n active={activeItem === item.id}\n badge={badges[item.id]}\n onClick={() => onNavigate?.(item.id)}\n {...hover}\n />\n ))}\n </div>\n ))}\n </div>\n\n <div className=\"isb-foot\">\n {FOOTER_NAV.map((item) => (\n <Item\n key={item.id}\n item={item}\n active={activeItem === item.id}\n badge={badges[item.id]}\n onClick={() => onNavigate?.(item.id)}\n {...hover}\n />\n ))}\n </div>\n\n {tip && (\n <div className=\"isb-floatip\" style={{ top: tip.top }}>\n {tip.lbl}\n </div>\n )}\n </aside>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ .ik-btn{font-family:var(--font-ui,"Inter", system-ui, sans-serif);border-radius:var(--radius,4px);cursor:pointer;white-space:nowrap;box-sizing:border-box;-webkit-user-select:none;user-select:none;background:0 0;border:1px solid #0000;justify-content:center;align-items:center;gap:7px;font-weight:500;text-decoration:none;transition:background .12s,border-color .12s,color .12s,opacity .12s;display:inline-flex;position:relative}.ik-btn-s{height:28px;padding:0 12px;font-size:12px}.ik-btn-m{height:32px;padding:0 16px;font-size:13px}.ik-btn-l{height:36px;padding:0 18px;font-size:14px}.ik-btn-io.ik-btn-s{width:28px;padding:0}.ik-btn-io.ik-btn-m{width:32px;padding:0}.ik-btn-io.ik-btn-l{width:36px;padding:0}.ik-btn-fw{width:100%}.ik-btn-primary{background:var(--accent-safe,#00aa85);color:var(--fg-on-accent,#0d1117);border-color:var(--accent-safe,#00aa85);font-weight:600}.ik-btn-primary:not(:disabled):hover{background:var(--accent-hover,#00cc9a);border-color:var(--accent-hover,#00cc9a)}.ik-btn-primary:not(:disabled):active{background:var(--accent,#00ffc2);border-color:var(--accent,#00ffc2)}.ik-btn-outline{border-color:var(--accent,#00ffc2);color:var(--accent-safe,#00aa85)}.ik-btn-outline:not(:disabled):hover{background:var(--accent-soft,#00aa8524)}.ik-btn-outline:not(:disabled):active{background:var(--accent-line,#00aa8552)}.ik-btn-secondary{border-color:var(--line,#30363d);color:var(--fg1,#f0f6fc)}.ik-btn-secondary:not(:disabled):hover{border-color:var(--accent,#00ffc2);color:var(--accent-safe,#00aa85)}.ik-btn-ghost{color:var(--fg2,#8b949e)}.ik-btn-ghost:not(:disabled):hover{background:var(--panel-muted,#202a35);color:var(--fg1,#f0f6fc)}.ik-btn-destructive{border-color:var(--status-err,#f85149);color:var(--status-err,#f85149)}.ik-btn-destructive:not(:disabled):hover{background:#f851491f}.ik-btn:focus-visible{box-shadow:0 0 0 1px var(--bg,#0d1117), 0 0 0 2px var(--accent,#00ffc2);outline:none}.ik-btn:disabled{cursor:not-allowed;opacity:.45}.ik-btn-content{justify-content:center;align-items:center;gap:inherit;display:inline-flex}.ik-btn-loading .ik-btn-content{opacity:0}.ik-btn-spinner{border:2px solid;border-top-color:#0000;border-radius:50%;width:1em;height:1em;animation:.6s linear infinite ik-btn-spin;position:absolute}@keyframes ik-btn-spin{to{transform:rotate(360deg)}}.ik-tf-wrap{width:100%;font-family:var(--font-ui,"Inter", system-ui, sans-serif);flex-direction:column;gap:6px;display:flex}.ik-tf-label{color:var(--fg2,#8b949e);font-size:12px;font-weight:500}.ik-tf-label .ik-tf-req{color:var(--status-err,#f85149);margin-left:2px}.ik-tf-field{box-sizing:border-box;background:var(--bg,#0d1117);border:1px solid var(--line,#30363d);border-radius:var(--radius,4px);color:var(--fg1,#f0f6fc);align-items:center;gap:8px;padding:0 10px;transition:border-color .12s,box-shadow .12s;display:flex}.ik-tf-s{height:28px;font-size:12px}.ik-tf-m{height:32px;font-size:13px}.ik-tf-l{height:36px;font-size:14px}.ik-tf-field:focus-within{border-color:var(--accent,#00ffc2);box-shadow:0 0 0 1px var(--accent,#00ffc2)}.ik-tf-input{min-width:0;color:var(--fg1,#f0f6fc);font:inherit;background:0 0;border:none;outline:none;flex:1;height:100%;padding:0}.ik-tf-input::placeholder{color:var(--fg3,#6e7681)}.ik-tf-input:-webkit-autofill{-webkit-text-fill-color:var(--fg1,#f0f6fc);transition:background-color 5000s}.ik-tf-ico{color:var(--fg3,#6e7681);flex-shrink:0;align-items:center;display:flex}.ik-tf-clear{color:var(--fg3,#6e7681);cursor:pointer;background:0 0;border:none;border-radius:2px;flex-shrink:0;justify-content:center;align-items:center;padding:2px;transition:color .12s;display:flex}.ik-tf-clear:hover{color:var(--fg1,#f0f6fc)}.ik-tf-clear:focus-visible{box-shadow:0 0 0 1px var(--accent,#00ffc2);color:var(--fg1,#f0f6fc);outline:none}.ik-tf-field.is-error{border-color:var(--status-err,#f85149)}.ik-tf-field.is-error:focus-within{border-color:var(--status-err,#f85149);box-shadow:0 0 0 1px var(--status-err,#f85149)}.ik-tf-field.is-disabled{opacity:.5;cursor:not-allowed}.ik-tf-field.is-disabled .ik-tf-input{cursor:not-allowed}.ik-tf-msg{color:var(--fg3,#6e7681);font-size:11px;line-height:1.4}.ik-tf-msg.is-error{color:var(--status-err,#f85149)}.ik-ta-wrap{width:100%;font-family:var(--font-ui,"Inter", system-ui, sans-serif);flex-direction:column;gap:6px;display:flex}.ik-ta-label{color:var(--fg2,#8b949e);font-size:12px;font-weight:500}.ik-ta-label .ik-ta-req{color:var(--status-err,#f85149);margin-left:2px}.ik-ta-field{box-sizing:border-box;background:var(--bg,#0d1117);border:1px solid var(--line,#30363d);border-radius:var(--radius,4px);width:100%;color:var(--fg1,#f0f6fc);font:inherit;outline:none;padding:8px 10px;font-size:13px;line-height:1.45;transition:border-color .12s,box-shadow .12s;display:block}.ik-ta-field::placeholder{color:var(--fg3,#6e7681)}.ik-ta-field:focus{border-color:var(--accent,#00ffc2);box-shadow:0 0 0 1px var(--accent,#00ffc2)}.ik-ta-resize-none{resize:none}.ik-ta-resize-vertical{resize:vertical}.ik-ta-field.is-error{border-color:var(--status-err,#f85149)}.ik-ta-field.is-error:focus{box-shadow:0 0 0 1px var(--status-err,#f85149)}.ik-ta-field:disabled{opacity:.5;cursor:not-allowed}.ik-ta-foot{justify-content:space-between;gap:8px;display:flex}.ik-ta-msg{color:var(--fg3,#6e7681);font-size:11px;line-height:1.4}.ik-ta-msg.is-error{color:var(--status-err,#f85149)}.ik-ta-count{color:var(--fg3,#6e7681);font-size:11px;font-family:var(--font-mono,monospace);margin-left:auto}.ik-cb{cursor:pointer;font-family:var(--font-ui,"Inter", system-ui, sans-serif);color:var(--fg1,#f0f6fc);-webkit-user-select:none;user-select:none;align-items:flex-start;gap:9px;display:inline-flex;position:relative}.ik-cb.is-disabled{cursor:not-allowed;opacity:.5}.ik-cb-input{opacity:0;width:1px;height:1px;margin:0;position:absolute}.ik-cb-box{box-sizing:border-box;border:1px solid var(--line,#30363d);background:var(--bg,#0d1117);color:var(--fg-on-accent,#0d1117);border-radius:3px;flex-shrink:0;justify-content:center;align-items:center;margin-top:1px;transition:background .12s,border-color .12s,box-shadow .12s;display:flex}.ik-cb-s .ik-cb-box{width:14px;height:14px}.ik-cb-m .ik-cb-box{width:16px;height:16px}.ik-cb:not(.is-disabled):hover .ik-cb-box{border-color:var(--accent,#00ffc2)}.ik-cb-check,.ik-cb-dash{display:none}.ik-cb-input:checked+.ik-cb-box,.ik-cb-input:indeterminate+.ik-cb-box{background:var(--accent-safe,#00aa85);border-color:var(--accent-safe,#00aa85)}.ik-cb-input:checked+.ik-cb-box .ik-cb-check{display:block}.ik-cb-input:indeterminate+.ik-cb-box .ik-cb-check{display:none}.ik-cb-input:indeterminate+.ik-cb-box .ik-cb-dash{display:block}.ik-cb-input:focus-visible+.ik-cb-box{box-shadow:0 0 0 1px var(--bg,#0d1117), 0 0 0 2px var(--accent,#00ffc2)}.ik-cb-textwrap{flex-direction:column;display:flex}.ik-cb-text{font-size:13px;line-height:1.45}.ik-cb-s .ik-cb-text{font-size:12px}.ik-cb-desc{color:var(--fg2,#8b949e);margin-top:2px;font-size:11px;line-height:1.4}.ik-rdg{font-family:var(--font-ui,"Inter", system-ui, sans-serif);display:flex}.ik-rdg-vertical{flex-direction:column;gap:14px}.ik-rdg-horizontal{flex-flow:wrap;gap:24px}.ik-rd{cursor:pointer;color:var(--fg1,#f0f6fc);-webkit-user-select:none;user-select:none;align-items:flex-start;gap:9px;display:inline-flex;position:relative}.ik-rd.is-disabled{cursor:not-allowed;opacity:.5}.ik-rd-input{opacity:0;width:1px;height:1px;margin:0;position:absolute}.ik-rd-circle{box-sizing:border-box;border:1px solid var(--line,#30363d);background:var(--bg,#0d1117);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;margin-top:1px;transition:border-color .12s,box-shadow .12s;display:flex}.ik-rd-s .ik-rd-circle{width:14px;height:14px}.ik-rd-m .ik-rd-circle{width:16px;height:16px}.ik-rd:not(.is-disabled):hover .ik-rd-circle{border-color:var(--accent,#00ffc2)}.ik-rd-dot{background:var(--accent,#00ffc2);border-radius:50%;transition:transform .12s cubic-bezier(.2,.6,.2,1);transform:scale(0)}.ik-rd-s .ik-rd-dot{width:6px;height:6px}.ik-rd-m .ik-rd-dot{width:8px;height:8px}.ik-rd-input:checked+.ik-rd-circle{border-color:var(--accent,#00ffc2)}.ik-rd-input:checked+.ik-rd-circle .ik-rd-dot{transform:scale(1)}.ik-rd-input:focus-visible+.ik-rd-circle{box-shadow:0 0 0 1px var(--bg,#0d1117), 0 0 0 2px var(--accent,#00ffc2)}.ik-rd-textwrap{flex-direction:column;display:flex}.ik-rd-text{font-size:13px;line-height:1.45}.ik-rd-s .ik-rd-text{font-size:12px}.ik-rd-desc{color:var(--fg2,#8b949e);margin-top:2px;font-size:11px;line-height:1.4}.ik-sw{cursor:pointer;font-family:var(--font-ui,"Inter", system-ui, sans-serif);color:var(--fg1,#f0f6fc);-webkit-user-select:none;user-select:none;align-items:flex-start;gap:10px;display:inline-flex;position:relative}.ik-sw.is-disabled{cursor:not-allowed;opacity:.5}.ik-sw-input{opacity:0;width:1px;height:1px;margin:0;position:absolute}.ik-sw-track{background:var(--line,#30363d);flex-shrink:0;margin-top:1px;transition:background .15s;position:relative}.ik-sw-knob{background:var(--fg1,#f0f6fc);border-radius:50%;transition:transform .15s cubic-bezier(.2,.6,.2,1);position:absolute;box-shadow:0 0 0 1px #0000000f}.ik-sw-m .ik-sw-track{border-radius:10px;width:34px;height:19px}.ik-sw-m .ik-sw-knob{width:15px;height:15px;top:2px;left:2px}.ik-sw-m .ik-sw-input:checked+.ik-sw-track .ik-sw-knob{transform:translate(15px)}.ik-sw-s .ik-sw-track{border-radius:9px;width:30px;height:17px}.ik-sw-s .ik-sw-knob{width:13px;height:13px;top:2px;left:2px}.ik-sw-s .ik-sw-input:checked+.ik-sw-track .ik-sw-knob{transform:translate(13px)}.ik-sw-input:checked+.ik-sw-track{background:var(--accent-safe,#00aa85)}.ik-sw-input:focus-visible+.ik-sw-track{box-shadow:0 0 0 1px var(--bg,#0d1117), 0 0 0 2px var(--accent,#00ffc2)}.ik-sw-textwrap{flex-direction:column;display:flex}.ik-sw-text{font-size:13px;line-height:1.45}.ik-sw-s .ik-sw-text{font-size:12px}.ik-sw-desc{color:var(--fg2,#8b949e);margin-top:2px;font-size:11px;line-height:1.4}.ik-bdg{font-family:var(--font-ui,"Inter", system-ui, sans-serif);white-space:nowrap;border:1px solid;border-color:color-mix(in srgb, currentColor 38%, transparent);background:color-mix(in srgb, currentColor 12%, transparent);border-radius:3px;align-items:center;gap:6px;font-weight:500;line-height:1;display:inline-flex}.ik-bdg-m{padding:5px 10px;font-size:12px}.ik-bdg-s{gap:5px;padding:3px 7px;font-size:11px}.ik-bdg-dot{background:currentColor;border-radius:50%;flex-shrink:0;width:6px;height:6px}.ik-bdg-s .ik-bdg-dot{width:5px;height:5px}.ik-bdg-success{color:var(--status-ok,#00ffc2)}.ik-bdg-warning{color:var(--status-warn,#f97316)}.ik-bdg-error{color:var(--status-err,#f85149)}.ik-bdg-info{color:var(--status-info,#58a6ff)}.ik-bdg-accent{color:var(--accent-safe,#00aa85)}.ik-bdg-neutral{color:var(--fg2,#8b949e);border-color:var(--line,#30363d);background:var(--panel,#161b22)}.ik-tag{font-family:var(--font-mono,"JetBrains Mono", monospace);letter-spacing:.04em;color:var(--fg2,#8b949e);background:var(--bg,#0d1117);border:1px solid var(--line,#30363d);border-radius:2px;align-items:center;gap:5px;padding:2px 6px;font-size:10px;line-height:1.4;display:inline-flex}.ik-tag-accent{color:var(--accent-safe,#00aa85);background:var(--accent-soft,#00aa8524);border-color:var(--accent-line,#00aa8552)}.ik-tag-x{color:currentColor;opacity:.65;cursor:pointer;background:0 0;border:none;border-radius:2px;justify-content:center;align-items:center;margin:-1px -2px -1px 0;padding:0;display:inline-flex}.ik-tag-x:hover{opacity:1}.ik-tag-x:focus-visible{box-shadow:0 0 0 1px var(--accent,#00ffc2);opacity:1;outline:none}.ik-av{box-sizing:border-box;background:var(--panel-muted,#202a35);color:var(--fg2,#8b949e);border:1px solid var(--line,#30363d);font-family:var(--font-mono,"JetBrains Mono", monospace);text-transform:uppercase;-webkit-user-select:none;user-select:none;flex-shrink:0;justify-content:center;align-items:center;font-weight:600;display:inline-flex;position:relative;overflow:hidden}.ik-av-circle{border-radius:50%}.ik-av-square{border-radius:var(--radius,4px)}.ik-av-sm{width:24px;height:24px;font-size:10px}.ik-av-md{width:32px;height:32px;font-size:12px}.ik-av-lg{width:48px;height:48px;font-size:16px}.ik-av-img{object-fit:cover;width:100%;height:100%}.ik-av-status{border:2px solid var(--panel,#161b22);box-sizing:border-box;border-radius:50%;width:30%;min-width:7px;height:30%;min-height:7px;position:absolute;bottom:-1px;right:-1px}.ik-av-status-online{background:var(--status-ok,#00ffc2)}.ik-av-status-warn{background:var(--status-warn,#f97316)}.ik-av-status-off{background:var(--status-off,#6e7681)}.ik-av-status-error{background:var(--status-err,#f85149)}.ik-card{box-sizing:border-box;background:var(--panel,#161b22);border:1px solid var(--line,#30363d);border-radius:var(--radius,4px);color:var(--fg1,#f0f6fc);font-family:var(--font-ui,"Inter", system-ui, sans-serif);display:block}.ik-card-pad-none{padding:0}.ik-card-pad-s{padding:12px}.ik-card-pad-m{padding:16px}.ik-card-pad-l{padding:24px}.ik-card-elevated{background:var(--panel-soft,#1d2530)}.ik-card-interactive{cursor:pointer;transition:border-color .12s,background .12s}.ik-card-interactive:hover{border-color:var(--accent,#00ffc2)}.ik-card-interactive:focus-visible{box-shadow:0 0 0 1px var(--bg,#0d1117), 0 0 0 2px var(--accent,#00ffc2);outline:none}.ik-card-selected{border-color:var(--accent,#00ffc2);background:var(--accent-soft,#00aa8524)}.ik-card-header{border-bottom:1px solid var(--line,#30363d);justify-content:space-between;align-items:center;gap:8px;padding:12px 16px;font-weight:600;display:flex}.ik-card-body{padding:16px}.ik-card-footer{border-top:1px solid var(--line,#30363d);align-items:center;gap:8px;padding:12px 16px;display:flex}.ik-sk{background:var(--panel-muted,#202a35);border-radius:var(--radius,4px);display:block}.ik-sk-text{border-radius:3px;height:.7em}.ik-sk-circle{border-radius:50%}.ik-sk-rect{border-radius:var(--radius,4px)}.ik-sk-animated{position:relative;overflow:hidden}.ik-sk-animated:after{content:"";background:linear-gradient(90deg, transparent, color-mix(in srgb, var(--fg3,#6e7681) 18%, transparent), transparent);animation:1.4s infinite ik-sk-shimmer;position:absolute;inset:0;transform:translate(-100%)}.ik-sk-lines{flex-direction:column;gap:8px;display:flex}@keyframes ik-sk-shimmer{to{transform:translate(100%)}}.ik-spinner{box-sizing:border-box;border:2px solid var(--line,#30363d);border-top-color:var(--accent,#00ffc2);vertical-align:middle;border-radius:50%;animation:.6s linear infinite ik-spinner-spin;display:inline-block}.ik-spinner-s{width:14px;height:14px}.ik-spinner-m{width:18px;height:18px}.ik-spinner-l{border-width:3px;width:24px;height:24px}.ik-spinner-label{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}@keyframes ik-spinner-spin{to{transform:rotate(360deg)}}.ik-ff{width:100%;font-family:var(--font-ui,"Inter", system-ui, sans-serif);flex-direction:column;gap:6px;display:flex}.ik-ff-label{color:var(--fg2,#8b949e);font-size:12px;font-weight:500}.ik-ff-req{color:var(--status-err,#f85149);margin-left:2px}.ik-ff-msg{color:var(--fg3,#6e7681);font-size:11px;line-height:1.4}.ik-ff-msg.is-error{color:var(--status-err,#f85149)}.ik-alert{box-sizing:border-box;border-radius:var(--radius,4px);border:1px solid;border-color:color-mix(in srgb, currentColor 38%, transparent);background:color-mix(in srgb, currentColor 10%, transparent);font-family:var(--font-ui,"Inter", system-ui, sans-serif);align-items:flex-start;gap:10px;padding:12px 14px;font-size:13px;line-height:1.45;display:flex}.ik-alert-info{color:var(--status-info,#58a6ff)}.ik-alert-success{color:var(--status-ok,#00ffc2)}.ik-alert-warning{color:var(--status-warn,#f97316)}.ik-alert-error{color:var(--status-err,#f85149)}.ik-alert-ico{flex-shrink:0;margin-top:1px}.ik-alert-body{min-width:0;color:var(--fg1,#f0f6fc);flex:1}.ik-alert-title{color:inherit;margin-bottom:2px;font-weight:600}.ik-alert-title.has-color{color:var(--fg1,#f0f6fc)}.ik-alert-close{color:var(--fg3,#6e7681);cursor:pointer;background:0 0;border:none;border-radius:2px;flex-shrink:0;justify-content:center;align-items:center;margin:-2px -4px -2px 0;padding:2px;display:inline-flex}.ik-alert-close:hover{color:var(--fg1,#f0f6fc)}.ik-alert-close:focus-visible{box-shadow:0 0 0 1px var(--accent,#00ffc2);color:var(--fg1,#f0f6fc);outline:none}.ik-empty{text-align:center;font-family:var(--font-ui,"Inter", system-ui, sans-serif);color:var(--fg2,#8b949e);flex-direction:column;align-items:center;gap:8px;padding:48px 24px;display:flex}.ik-empty-ico{color:var(--fg3,#6e7681);margin-bottom:4px}.ik-empty-title{color:var(--fg1,#f0f6fc);font-size:15px;font-weight:600}.ik-empty-desc{max-width:360px;font-size:13px;line-height:1.5}.ik-empty-action{margin-top:8px}.ik-modal-overlay{z-index:var(--z-modal,1300);background:color-mix(in srgb, var(--scrim,#0d1117) var(--ik-overlay,60%), transparent);justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.ik-modal{box-sizing:border-box;background:var(--panel,#161b22);border:1px solid var(--line,#30363d);border-radius:var(--radius,4px);width:100%;max-height:calc(100vh - 48px);color:var(--fg1,#f0f6fc);font-family:var(--font-ui,"Inter", system-ui, sans-serif);outline:none;flex-direction:column;display:flex}.ik-modal-s{max-width:360px}.ik-modal-m{max-width:480px}.ik-modal-l{max-width:720px}.ik-modal-header{justify-content:space-between;align-items:flex-start;gap:12px;padding:16px 16px 0;display:flex}.ik-modal-titles{min-width:0}.ik-modal-title{letter-spacing:-.01em;font-size:16px;font-weight:600}.ik-modal-desc{color:var(--fg2,#8b949e);margin-top:4px;font-size:13px;line-height:1.45}.ik-modal-close{border:1px solid var(--line,#30363d);width:24px;height:24px;color:var(--fg3,#6e7681);cursor:pointer;background:0 0;border-radius:3px;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.ik-modal-close:hover{color:var(--fg1,#f0f6fc);border-color:var(--accent,#00ffc2)}.ik-modal-close:focus-visible{box-shadow:0 0 0 1px var(--accent,#00ffc2);outline:none}.ik-modal-body{padding:16px;font-size:13px;line-height:1.5;overflow-y:auto}.ik-modal-footer{justify-content:flex-end;align-items:center;gap:8px;padding:0 16px 16px;display:flex}.ik-tabs{font-family:var(--font-ui,"Inter", system-ui, sans-serif)}.ik-tabs-list{border-bottom:1px solid var(--line,#30363d);gap:2px;display:flex}.ik-tabs-tab{height:36px;color:var(--fg2,#8b949e);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-bottom:2px solid #0000;align-items:center;gap:6px;margin-bottom:-1px;padding:0 12px;font-size:13px;font-weight:500;transition:color .12s,border-color .12s;display:inline-flex;position:relative}.ik-tabs-tab:hover:not(:disabled){color:var(--fg1,#f0f6fc)}.ik-tabs-tab[aria-selected=true]{color:var(--accent-safe,#00aa85);border-bottom-color:var(--accent,#00ffc2)}.ik-tabs-tab:disabled{opacity:.45;cursor:not-allowed}.ik-tabs-tab:focus-visible{box-shadow:inset 0 0 0 1px var(--accent,#00ffc2);border-radius:3px;outline:none}.ik-tabs-panel{color:var(--fg1,#f0f6fc);padding:16px 0;font-size:13px;line-height:1.5}.ik-tabs-panel:focus-visible{outline:none}.ik-table-wrap{border:1px solid var(--line,#30363d);border-radius:var(--radius,4px);width:100%;overflow:auto}.ik-table{border-collapse:collapse;width:100%;font-family:var(--font-ui,"Inter", system-ui, sans-serif);color:var(--fg1,#f0f6fc);font-size:13px}.ik-table caption{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.ik-table th{text-align:left;font-family:var(--font-mono,"JetBrains Mono", monospace);letter-spacing:.08em;text-transform:uppercase;color:var(--fg3,#6e7681);background:var(--panel-muted,#202a35);border-bottom:1px solid var(--line,#30363d);white-space:nowrap;font-size:10px;font-weight:600}.ik-table td{border-bottom:1px solid var(--line-soft,#30363d80);color:var(--fg1,#f0f6fc);vertical-align:middle}.ik-table tbody tr:last-child td{border-bottom:none}.ik-table-regular th,.ik-table-regular td{padding:10px 14px}.ik-table-compact th,.ik-table-compact td{padding:6px 10px}.ik-table-sticky thead th{z-index:1;position:sticky;top:0}.ik-table-align-right{text-align:right}.ik-table-align-center{text-align:center}.ik-table-row-clickable{cursor:pointer}.ik-table-row-clickable:hover td{background:var(--panel-muted,#202a35)}.ik-table-row-selected td{background:var(--accent-soft,#00aa8524)}.ik-table-state{padding:0}.ik-toast-viewport{z-index:var(--z-toast,1400);pointer-events:none;flex-direction:column;gap:8px;width:340px;max-width:calc(100vw - 32px);display:flex;position:fixed;bottom:16px;right:16px}.ik-toast{box-sizing:border-box;background:var(--panel-soft,#1d2530);border:1px solid var(--line,#30363d);border-left:2px solid var(--fg3,#6e7681);border-radius:var(--radius,4px);color:var(--fg1,#f0f6fc);font-family:var(--font-ui,"Inter", system-ui, sans-serif);pointer-events:auto;align-items:flex-start;gap:10px;padding:12px 12px 12px 14px;font-size:13px;line-height:1.45;animation:.18s cubic-bezier(.2,.6,.2,1) ik-toast-in;display:flex}.ik-toast-info{border-left-color:var(--status-info,#58a6ff)}.ik-toast-success{border-left-color:var(--status-ok,#00ffc2)}.ik-toast-warning{border-left-color:var(--status-warn,#f97316)}.ik-toast-error{border-left-color:var(--status-err,#f85149)}.ik-toast-body{flex:1;min-width:0}.ik-toast-title{font-weight:600}.ik-toast-desc{color:var(--fg2,#8b949e);margin-top:2px}.ik-toast-action{margin-top:8px}.ik-toast-close{color:var(--fg3,#6e7681);cursor:pointer;background:0 0;border:none;border-radius:2px;flex-shrink:0;justify-content:center;align-items:center;padding:2px;display:inline-flex}.ik-toast-close:hover{color:var(--fg1,#f0f6fc)}.ik-toast-close:focus-visible{box-shadow:0 0 0 1px var(--accent,#00ffc2);outline:none}@keyframes ik-toast-in{0%{opacity:0;transform:translateY(8px)}}.iskra-sb{background:var(--panel,#161b22);border-right:1px solid var(--line,#30363d);width:220px;height:100%;font-family:var(--font-ui,"Inter", system-ui, sans-serif);flex-direction:column;flex-shrink:0;font-size:14px;transition:width .18s cubic-bezier(.2,.6,.2,1);display:flex;position:relative;overflow:hidden}.iskra-sb.isb-c{width:52px}.iskra-sb.isb-c.isb-tip-rdy{overflow:visible}.isb-logo{border-bottom:1px solid var(--line,#30363d);align-items:center;gap:10px;height:52px;min-height:52px;padding:0 14px;display:flex;overflow:hidden}.isb-spark{width:20px;height:20px;color:var(--accent,#00ffc2);flex-shrink:0;justify-content:center;align-items:center;display:flex}.isb-wmark{font-family:var(--font-mono,"JetBrains Mono", monospace);letter-spacing:.05em;color:var(--fg1,#f0f6fc);white-space:nowrap;flex:1;font-size:12px;font-weight:700;transition:opacity .14s;overflow:hidden}.iskra-sb.isb-c .isb-wmark{opacity:0}.isb-collapser{border:1px solid var(--line,#30363d);width:20px;height:20px;color:var(--fg3,#6e7681);cursor:pointer;background:0 0;border-radius:3px;flex-shrink:0;justify-content:center;align-items:center;padding:0;transition:color .12s,border-color .12s;display:flex}.isb-collapser:hover{color:var(--fg1,#f0f6fc);border-color:var(--accent,#00ffc2)}.isb-collapser svg{width:10px;height:10px;transition:transform .18s cubic-bezier(.2,.6,.2,1)}.iskra-sb.isb-c .isb-collapser svg{transform:rotate(180deg)}.isb-scroll{scrollbar-width:thin;scrollbar-color:var(--line,#30363d) transparent;flex:1;padding:6px 0;overflow:hidden auto}.isb-grp+.isb-grp{margin-top:2px}.iskra-sb.isb-c .isb-grp+.isb-grp{border-top:1px solid var(--line-soft,#30363d73);margin-top:4px;padding-top:4px}.isb-sec{font-family:var(--font-mono,"JetBrains Mono", monospace);letter-spacing:.1em;text-transform:uppercase;color:var(--fg3,#6e7681);white-space:nowrap;opacity:1;max-height:36px;padding:14px 14px 4px;font-size:10px;transition:max-height .18s cubic-bezier(.2,.6,.2,1),opacity .1s,padding .18s;overflow:hidden}.iskra-sb.isb-c .isb-sec{opacity:0;pointer-events:none;max-height:0;padding-top:0;padding-bottom:0}.isb-item{width:100%;height:36px;color:var(--fg2,#8b949e);font-family:var(--font-ui,"Inter", sans-serif);text-align:left;white-space:nowrap;cursor:pointer;box-sizing:border-box;background:0 0;border:none;border-left:2px solid #0000;align-items:center;gap:10px;padding:0 14px;font-size:13.5px;font-weight:400;transition:color .12s,background .12s,border-color .12s;display:flex;position:relative}.isb-item:hover{background:var(--panel-muted,#202a35);color:var(--fg1,#f0f6fc)}.isb-item.isb-on{background:var(--accent-soft,#00aa8524);color:var(--accent-safe,#00aa85);border-left-color:var(--accent,#00ffc2);font-weight:500}.isb-item.isb-on:hover{background:var(--accent-soft,#00aa8524);color:var(--accent-safe,#00aa85)}.iskra-sb.isb-c .isb-item{justify-content:center;gap:0;padding:0}.isb-item:focus-visible{box-shadow:inset 0 0 0 1px var(--accent,#00ffc2);outline:none}.isb-collapser:focus-visible{box-shadow:0 0 0 1px var(--accent,#00ffc2);outline:none}.isb-ico{flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:flex}.isb-lbl{text-overflow:ellipsis;opacity:1;flex:1;max-width:160px;transition:max-width .18s cubic-bezier(.2,.6,.2,1),opacity .1s;overflow:hidden}.iskra-sb.isb-c .isb-lbl{opacity:0;max-width:0}.isb-bdg{background:var(--status-warn,#f97316);min-width:17px;height:17px;color:var(--fg-on-status,#fff);font-family:var(--font-mono,"JetBrains Mono", monospace);opacity:1;border-radius:9px;flex-shrink:0;justify-content:center;align-items:center;max-width:40px;padding:0 4px;font-size:10px;font-weight:700;line-height:1;transition:max-width .18s,opacity .1s,padding .18s,min-width .18s;display:flex;overflow:hidden}.iskra-sb.isb-c .isb-bdg{opacity:0;min-width:0;max-width:0;padding:0}.isb-foot{border-top:1px solid var(--line,#30363d);flex-shrink:0;padding:6px 0}.isb-floatip{background:var(--panel-soft,#1d2530);border:1px solid var(--line,#30363d);color:var(--fg1,#f0f6fc);font-size:12px;font-family:var(--font-ui,"Inter", sans-serif);white-space:nowrap;pointer-events:none;z-index:999;border-radius:4px;padding:5px 10px;font-weight:400;position:absolute;left:calc(100% + 10px);transform:translateY(-50%)}
2
+ /*$vite$:1*/
@@ -0,0 +1,3 @@
1
+ /** Joins truthy class-name fragments into a single string. */
2
+ export declare function cx(...parts: Array<string | false | null | undefined>): string;
3
+ //# sourceMappingURL=cx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cx.d.ts","sourceRoot":"","sources":["../../src/utils/cx.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,wBAAgB,EAAE,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM,CAE7E"}
@@ -0,0 +1,8 @@
1
+ import { type RefObject } from 'react';
2
+ /**
3
+ * Traps Tab focus inside `ref` while `active`. On activate it focuses the first
4
+ * focusable element (or the container); on deactivate it restores focus to the
5
+ * element that was focused before. Used by Modal/Dialog.
6
+ */
7
+ export declare function useFocusTrap(ref: RefObject<HTMLElement | null>, active: boolean): void;
8
+ //# sourceMappingURL=useFocusTrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFocusTrap.d.ts","sourceRoot":"","sources":["../../src/utils/useFocusTrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKlD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAmCtF"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@iskra-ui/react",
3
+ "version": "0.1.0",
4
+ "description": "Искра.DCI React component library (Hard-Shell Minimal).",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js",
16
+ "require": "./dist/index.cjs"
17
+ },
18
+ "./styles.css": "./dist/styles.css"
19
+ },
20
+ "sideEffects": [
21
+ "**/*.css"
22
+ ],
23
+ "peerDependencies": {
24
+ "react": ">=18",
25
+ "react-dom": ">=18"
26
+ },
27
+ "dependencies": {
28
+ "@iskra-ui/core": "0.1.0",
29
+ "@iskra-ui/icons": "0.1.0"
30
+ },
31
+ "devDependencies": {
32
+ "@storybook/react-vite": "^10.4.0",
33
+ "@testing-library/jest-dom": "^6.9.0",
34
+ "@testing-library/react": "^16.0.0",
35
+ "@testing-library/user-event": "^14.6.0",
36
+ "@types/react": "^19.2.0",
37
+ "@types/react-dom": "^19.2.0",
38
+ "@vitejs/plugin-react": "^6.0.0",
39
+ "jsdom": "^29.0.0",
40
+ "react": "^19.2.0",
41
+ "react-dom": "^19.2.0",
42
+ "typescript": "^6.0.0",
43
+ "vite": "^8.0.0",
44
+ "vitest": "^4.1.0",
45
+ "vitest-axe": "^0.1.0",
46
+ "@iskra-ui/styles": "0.1.0",
47
+ "@iskra-ui/tokens": "0.1.0",
48
+ "@iskra-ui/tsconfig": "0.1.0"
49
+ },
50
+ "publishConfig": {
51
+ "access": "public",
52
+ "provenance": true
53
+ },
54
+ "scripts": {
55
+ "build": "vite build && tsc --emitDeclarationOnly -p tsconfig.build.json",
56
+ "dev": "vite build --watch",
57
+ "typecheck": "tsc --noEmit -p tsconfig.json",
58
+ "test": "vitest run"
59
+ }
60
+ }