@iskra-ui/vue 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 (35) hide show
  1. package/LICENCE.md +79 -0
  2. package/dist/components/Alert.vue.d.ts +32 -0
  3. package/dist/components/Alert.vue.d.ts.map +1 -0
  4. package/dist/components/Badge.vue.d.ts +29 -0
  5. package/dist/components/Badge.vue.d.ts.map +1 -0
  6. package/dist/components/Button.vue.d.ts +43 -0
  7. package/dist/components/Button.vue.d.ts.map +1 -0
  8. package/dist/components/Card.vue.d.ts +29 -0
  9. package/dist/components/Card.vue.d.ts.map +1 -0
  10. package/dist/components/CardBody.vue.d.ts +14 -0
  11. package/dist/components/CardBody.vue.d.ts.map +1 -0
  12. package/dist/components/CardFooter.vue.d.ts +14 -0
  13. package/dist/components/CardFooter.vue.d.ts.map +1 -0
  14. package/dist/components/CardHeader.vue.d.ts +14 -0
  15. package/dist/components/CardHeader.vue.d.ts.map +1 -0
  16. package/dist/components/Icon.vue.d.ts +17 -0
  17. package/dist/components/Icon.vue.d.ts.map +1 -0
  18. package/dist/components/Spinner.vue.d.ts +16 -0
  19. package/dist/components/Spinner.vue.d.ts.map +1 -0
  20. package/dist/components/Switch.vue.d.ts +31 -0
  21. package/dist/components/Switch.vue.d.ts.map +1 -0
  22. package/dist/components/Tabs.vue.d.ts +33 -0
  23. package/dist/components/Tabs.vue.d.ts.map +1 -0
  24. package/dist/components/TextField.vue.d.ts +56 -0
  25. package/dist/components/TextField.vue.d.ts.map +1 -0
  26. package/dist/index.cjs +2 -0
  27. package/dist/index.cjs.map +1 -0
  28. package/dist/index.d.ts +14 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +574 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/utils/cx.d.ts +3 -0
  33. package/dist/utils/cx.d.ts.map +1 -0
  34. package/dist/vue.css +2 -0
  35. package/package.json +55 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["$slots"],"sources":["../../icons/dist/icons.js","../src/components/Icon.vue","../src/components/Icon.vue","../src/utils/cx.ts","../src/components/Button.vue","../src/components/Button.vue","../src/components/Badge.vue","../src/components/Badge.vue","../src/components/Spinner.vue","../src/components/Spinner.vue","../../core/dist/id.js","../../core/dist/keyboard.js","../../core/dist/tabs.js","../src/components/Switch.vue","../src/components/Switch.vue","../src/components/Alert.vue","../src/components/Alert.vue","../src/components/Card.vue","../src/components/Card.vue","../src/components/CardHeader.vue","../src/components/CardBody.vue","../src/components/CardFooter.vue","../src/components/TextField.vue","../src/components/TextField.vue","../src/components/Tabs.vue","../src/components/Tabs.vue"],"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","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { icons, type IconName } from '@iskra-ui/icons';\n\nconst props = withDefaults(\n defineProps<{\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 }>(),\n { size: '1em', strokeWidth: 1.5 },\n);\n\nconst px = computed(() => (typeof props.size === 'number' ? `${props.size}px` : props.size));\nconst inner = computed(\n () => (props.title ? `<title>${props.title}</title>` : '') + icons[props.name],\n);\n</script>\n\n<template>\n <svg\n class=\"iskra-icon\"\n :width=\"px\"\n :height=\"px\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n :stroke-width=\"strokeWidth\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n :role=\"title ? 'img' : undefined\"\n :aria-hidden=\"title ? undefined : 'true'\"\n :aria-label=\"title || undefined\"\n style=\"display: inline-block; flex-shrink: 0; vertical-align: middle\"\n v-html=\"inner\"\n />\n</template>\n","<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { icons, type IconName } from '@iskra-ui/icons';\n\nconst props = withDefaults(\n defineProps<{\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 }>(),\n { size: '1em', strokeWidth: 1.5 },\n);\n\nconst px = computed(() => (typeof props.size === 'number' ? `${props.size}px` : props.size));\nconst inner = computed(\n () => (props.title ? `<title>${props.title}</title>` : '') + icons[props.name],\n);\n</script>\n\n<template>\n <svg\n class=\"iskra-icon\"\n :width=\"px\"\n :height=\"px\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n :stroke-width=\"strokeWidth\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n :role=\"title ? 'img' : undefined\"\n :aria-hidden=\"title ? undefined : 'true'\"\n :aria-label=\"title || undefined\"\n style=\"display: inline-block; flex-shrink: 0; vertical-align: middle\"\n v-html=\"inner\"\n />\n</template>\n","/** Join truthy class fragments — mirrors the React package's `cx`. */\nexport function cx(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(' ');\n}\n","<script lang=\"ts\">\nexport type ButtonVariant = 'primary' | 'outline' | 'secondary' | 'ghost' | 'destructive';\nexport type ButtonSize = 's' | 'm' | 'l';\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { cx } from '../utils/cx.js';\n\nconst props = withDefaults(\n defineProps<{\n variant?: ButtonVariant;\n size?: ButtonSize;\n iconOnly?: boolean;\n loading?: boolean;\n fullWidth?: boolean;\n disabled?: boolean;\n type?: 'button' | 'submit' | 'reset';\n }>(),\n {\n variant: 'primary',\n size: 'm',\n iconOnly: false,\n loading: false,\n fullWidth: false,\n disabled: false,\n type: 'button',\n },\n);\n\nconst cls = computed(() =>\n cx(\n 'ik-btn',\n `ik-btn-${props.variant}`,\n `ik-btn-${props.size}`,\n props.iconOnly && 'ik-btn-io',\n props.fullWidth && 'ik-btn-fw',\n props.loading && 'ik-btn-loading',\n ),\n);\n</script>\n\n<template>\n <button :type=\"type\" :class=\"cls\" :disabled=\"disabled || loading\">\n <span v-if=\"loading\" class=\"ik-btn-spinner\" aria-hidden=\"true\" />\n <span class=\"ik-btn-content\">\n <slot name=\"iconBefore\" />\n <span v-if=\"!iconOnly\"><slot /></span>\n <slot v-else />\n <slot name=\"iconAfter\" />\n </span>\n </button>\n</template>\n","<script lang=\"ts\">\nexport type ButtonVariant = 'primary' | 'outline' | 'secondary' | 'ghost' | 'destructive';\nexport type ButtonSize = 's' | 'm' | 'l';\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { cx } from '../utils/cx.js';\n\nconst props = withDefaults(\n defineProps<{\n variant?: ButtonVariant;\n size?: ButtonSize;\n iconOnly?: boolean;\n loading?: boolean;\n fullWidth?: boolean;\n disabled?: boolean;\n type?: 'button' | 'submit' | 'reset';\n }>(),\n {\n variant: 'primary',\n size: 'm',\n iconOnly: false,\n loading: false,\n fullWidth: false,\n disabled: false,\n type: 'button',\n },\n);\n\nconst cls = computed(() =>\n cx(\n 'ik-btn',\n `ik-btn-${props.variant}`,\n `ik-btn-${props.size}`,\n props.iconOnly && 'ik-btn-io',\n props.fullWidth && 'ik-btn-fw',\n props.loading && 'ik-btn-loading',\n ),\n);\n</script>\n\n<template>\n <button :type=\"type\" :class=\"cls\" :disabled=\"disabled || loading\">\n <span v-if=\"loading\" class=\"ik-btn-spinner\" aria-hidden=\"true\" />\n <span class=\"ik-btn-content\">\n <slot name=\"iconBefore\" />\n <span v-if=\"!iconOnly\"><slot /></span>\n <slot v-else />\n <slot name=\"iconAfter\" />\n </span>\n </button>\n</template>\n","<script lang=\"ts\">\nexport type BadgeVariant = 'success' | 'warning' | 'error' | 'info' | 'accent' | 'neutral';\nexport type BadgeSize = 's' | 'm';\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { cx } from '../utils/cx.js';\n\nconst props = withDefaults(\n defineProps<{\n variant?: BadgeVariant;\n size?: BadgeSize;\n /** Show a leading status dot. */\n dot?: boolean;\n }>(),\n { variant: 'neutral', size: 'm', dot: false },\n);\n\nconst cls = computed(() => cx('ik-bdg', `ik-bdg-${props.size}`, `ik-bdg-${props.variant}`));\n</script>\n\n<template>\n <span :class=\"cls\">\n <span v-if=\"dot\" class=\"ik-bdg-dot\" aria-hidden=\"true\" />\n <slot name=\"icon\" />\n <slot />\n </span>\n</template>\n","<script lang=\"ts\">\nexport type BadgeVariant = 'success' | 'warning' | 'error' | 'info' | 'accent' | 'neutral';\nexport type BadgeSize = 's' | 'm';\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { cx } from '../utils/cx.js';\n\nconst props = withDefaults(\n defineProps<{\n variant?: BadgeVariant;\n size?: BadgeSize;\n /** Show a leading status dot. */\n dot?: boolean;\n }>(),\n { variant: 'neutral', size: 'm', dot: false },\n);\n\nconst cls = computed(() => cx('ik-bdg', `ik-bdg-${props.size}`, `ik-bdg-${props.variant}`));\n</script>\n\n<template>\n <span :class=\"cls\">\n <span v-if=\"dot\" class=\"ik-bdg-dot\" aria-hidden=\"true\" />\n <slot name=\"icon\" />\n <slot />\n </span>\n</template>\n","<script lang=\"ts\">\nexport type SpinnerSize = 's' | 'm' | 'l';\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { cx } from '../utils/cx.js';\n\nconst props = withDefaults(\n defineProps<{\n size?: SpinnerSize;\n /** Accessible label announced to screen readers. */\n label?: string;\n }>(),\n { size: 'm', label: 'Загрузка…' },\n);\n\nconst spinnerCls = computed(() => cx('ik-spinner', `ik-spinner-${props.size}`));\n</script>\n\n<template>\n <div role=\"status\" aria-live=\"polite\" class=\"ik-spinner-wrap\">\n <span :class=\"spinnerCls\" aria-hidden=\"true\" />\n <span class=\"ik-spinner-label\">{{ label }}</span>\n </div>\n</template>\n","<script lang=\"ts\">\nexport type SpinnerSize = 's' | 'm' | 'l';\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { cx } from '../utils/cx.js';\n\nconst props = withDefaults(\n defineProps<{\n size?: SpinnerSize;\n /** Accessible label announced to screen readers. */\n label?: string;\n }>(),\n { size: 'm', label: 'Загрузка…' },\n);\n\nconst spinnerCls = computed(() => cx('ik-spinner', `ik-spinner-${props.size}`));\n</script>\n\n<template>\n <div role=\"status\" aria-live=\"polite\" class=\"ik-spinner-wrap\">\n <span :class=\"spinnerCls\" aria-hidden=\"true\" />\n <span class=\"ik-spinner-label\">{{ label }}</span>\n </div>\n</template>\n","let counter = 0;\n/**\n * Deterministic-per-runtime id generator for wiring `aria-*` relationships in\n * environments without `useId` (e.g. Vue, plain DOM). Prefer a framework's\n * native id hook when available.\n */\nexport function createId(prefix = 'ik') {\n counter += 1;\n return `${prefix}-${counter}`;\n}\n/** Reset the counter — test-only helper for deterministic snapshots. */\nexport function resetIdCounter() {\n counter = 0;\n}\n//# sourceMappingURL=id.js.map","/** 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","<script lang=\"ts\">\nexport type SwitchSize = 's' | 'm';\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { createId } from '@iskra-ui/core';\nimport { cx } from '../utils/cx.js';\n\nconst props = withDefaults(\n defineProps<{\n /** Controlled checked state (v-model). */\n modelValue?: boolean;\n size?: SwitchSize;\n label?: string;\n description?: string;\n disabled?: boolean;\n id?: string;\n }>(),\n { modelValue: false, size: 'm', disabled: false },\n);\n\nconst emit = defineEmits<{ 'update:modelValue': [value: boolean]; change: [event: Event] }>();\n\nconst inputId = computed(() => props.id ?? createId('ik-sw'));\nconst rootCls = computed(() => cx('ik-sw', `ik-sw-${props.size}`, props.disabled && 'is-disabled'));\n\nfunction onChange(e: Event) {\n emit('update:modelValue', (e.target as HTMLInputElement).checked);\n emit('change', e);\n}\n</script>\n\n<template>\n <label :class=\"rootCls\" :for=\"inputId\">\n <input\n :id=\"inputId\"\n type=\"checkbox\"\n role=\"switch\"\n class=\"ik-sw-input\"\n :checked=\"modelValue\"\n :disabled=\"disabled\"\n @change=\"onChange\"\n />\n <span class=\"ik-sw-track\" aria-hidden=\"true\">\n <span class=\"ik-sw-knob\" />\n </span>\n <span v-if=\"label || description\" class=\"ik-sw-textwrap\">\n <span v-if=\"label\" class=\"ik-sw-text\">{{ label }}</span>\n <span v-if=\"description\" class=\"ik-sw-desc\">{{ description }}</span>\n </span>\n </label>\n</template>\n","<script lang=\"ts\">\nexport type SwitchSize = 's' | 'm';\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { createId } from '@iskra-ui/core';\nimport { cx } from '../utils/cx.js';\n\nconst props = withDefaults(\n defineProps<{\n /** Controlled checked state (v-model). */\n modelValue?: boolean;\n size?: SwitchSize;\n label?: string;\n description?: string;\n disabled?: boolean;\n id?: string;\n }>(),\n { modelValue: false, size: 'm', disabled: false },\n);\n\nconst emit = defineEmits<{ 'update:modelValue': [value: boolean]; change: [event: Event] }>();\n\nconst inputId = computed(() => props.id ?? createId('ik-sw'));\nconst rootCls = computed(() => cx('ik-sw', `ik-sw-${props.size}`, props.disabled && 'is-disabled'));\n\nfunction onChange(e: Event) {\n emit('update:modelValue', (e.target as HTMLInputElement).checked);\n emit('change', e);\n}\n</script>\n\n<template>\n <label :class=\"rootCls\" :for=\"inputId\">\n <input\n :id=\"inputId\"\n type=\"checkbox\"\n role=\"switch\"\n class=\"ik-sw-input\"\n :checked=\"modelValue\"\n :disabled=\"disabled\"\n @change=\"onChange\"\n />\n <span class=\"ik-sw-track\" aria-hidden=\"true\">\n <span class=\"ik-sw-knob\" />\n </span>\n <span v-if=\"label || description\" class=\"ik-sw-textwrap\">\n <span v-if=\"label\" class=\"ik-sw-text\">{{ label }}</span>\n <span v-if=\"description\" class=\"ik-sw-desc\">{{ description }}</span>\n </span>\n </label>\n</template>\n","<script lang=\"ts\">\nexport type AlertVariant = 'info' | 'success' | 'warning' | 'error';\n\nconst DEFAULT_ICON: Record<AlertVariant, string> = {\n info: 'info',\n success: 'check-circle',\n warning: 'warning',\n error: 'x-circle',\n};\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { type IconName } from '@iskra-ui/icons';\nimport { cx } from '../utils/cx.js';\nimport Icon from './Icon.vue';\n\nconst props = withDefaults(\n defineProps<{\n variant?: AlertVariant;\n title?: string;\n closable?: boolean;\n closeLabel?: string;\n }>(),\n { variant: 'info', closable: false, closeLabel: 'Закрыть' },\n);\n\nconst emit = defineEmits<{ close: [] }>();\n\nconst role = computed(() =>\n props.variant === 'error' || props.variant === 'warning' ? 'alert' : 'status',\n);\nconst cls = computed(() => cx('ik-alert', `ik-alert-${props.variant}`));\nconst iconName = computed(() => DEFAULT_ICON[props.variant] as IconName);\n</script>\n\n<template>\n <div :class=\"cls\" :role=\"role\">\n <span class=\"ik-alert-ico\" aria-hidden=\"true\">\n <slot name=\"icon\"><Icon :name=\"iconName\" :size=\"16\" /></slot>\n </span>\n <div class=\"ik-alert-body\">\n <div v-if=\"title\" class=\"ik-alert-title\">{{ title }}</div>\n <slot />\n </div>\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"ik-alert-close\"\n :aria-label=\"closeLabel\"\n @click=\"emit('close')\"\n >\n <Icon name=\"close\" :size=\"14\" />\n </button>\n </div>\n</template>\n","<script lang=\"ts\">\nexport type AlertVariant = 'info' | 'success' | 'warning' | 'error';\n\nconst DEFAULT_ICON: Record<AlertVariant, string> = {\n info: 'info',\n success: 'check-circle',\n warning: 'warning',\n error: 'x-circle',\n};\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { type IconName } from '@iskra-ui/icons';\nimport { cx } from '../utils/cx.js';\nimport Icon from './Icon.vue';\n\nconst props = withDefaults(\n defineProps<{\n variant?: AlertVariant;\n title?: string;\n closable?: boolean;\n closeLabel?: string;\n }>(),\n { variant: 'info', closable: false, closeLabel: 'Закрыть' },\n);\n\nconst emit = defineEmits<{ close: [] }>();\n\nconst role = computed(() =>\n props.variant === 'error' || props.variant === 'warning' ? 'alert' : 'status',\n);\nconst cls = computed(() => cx('ik-alert', `ik-alert-${props.variant}`));\nconst iconName = computed(() => DEFAULT_ICON[props.variant] as IconName);\n</script>\n\n<template>\n <div :class=\"cls\" :role=\"role\">\n <span class=\"ik-alert-ico\" aria-hidden=\"true\">\n <slot name=\"icon\"><Icon :name=\"iconName\" :size=\"16\" /></slot>\n </span>\n <div class=\"ik-alert-body\">\n <div v-if=\"title\" class=\"ik-alert-title\">{{ title }}</div>\n <slot />\n </div>\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"ik-alert-close\"\n :aria-label=\"closeLabel\"\n @click=\"emit('close')\"\n >\n <Icon name=\"close\" :size=\"14\" />\n </button>\n </div>\n</template>\n","<script lang=\"ts\">\nexport type CardPadding = 'none' | 's' | 'm' | 'l';\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { cx } from '../utils/cx.js';\n\nconst props = withDefaults(\n defineProps<{\n padding?: CardPadding;\n elevated?: boolean;\n /** Hoverable/focusable affordance. Provide a click handler and an accessible name. */\n interactive?: boolean;\n selected?: boolean;\n }>(),\n { padding: 'm', elevated: false, interactive: false, selected: false },\n);\n\nconst cls = computed(() =>\n cx(\n 'ik-card',\n `ik-card-pad-${props.padding}`,\n props.elevated && 'ik-card-elevated',\n props.interactive && 'ik-card-interactive',\n props.selected && 'ik-card-selected',\n ),\n);\n</script>\n\n<template>\n <div :class=\"cls\" :tabindex=\"interactive ? 0 : undefined\">\n <slot />\n </div>\n</template>\n","<script lang=\"ts\">\nexport type CardPadding = 'none' | 's' | 'm' | 'l';\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { cx } from '../utils/cx.js';\n\nconst props = withDefaults(\n defineProps<{\n padding?: CardPadding;\n elevated?: boolean;\n /** Hoverable/focusable affordance. Provide a click handler and an accessible name. */\n interactive?: boolean;\n selected?: boolean;\n }>(),\n { padding: 'm', elevated: false, interactive: false, selected: false },\n);\n\nconst cls = computed(() =>\n cx(\n 'ik-card',\n `ik-card-pad-${props.padding}`,\n props.elevated && 'ik-card-elevated',\n props.interactive && 'ik-card-interactive',\n props.selected && 'ik-card-selected',\n ),\n);\n</script>\n\n<template>\n <div :class=\"cls\" :tabindex=\"interactive ? 0 : undefined\">\n <slot />\n </div>\n</template>\n","<template>\n <div class=\"ik-card-header\"><slot /></div>\n</template>\n","<template>\n <div class=\"ik-card-body\"><slot /></div>\n</template>\n","<template>\n <div class=\"ik-card-footer\"><slot /></div>\n</template>\n","<script lang=\"ts\">\nexport type TextFieldSize = 's' | 'm' | 'l';\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\nimport { createId } from '@iskra-ui/core';\nimport { cx } from '../utils/cx.js';\n\nconst props = withDefaults(\n defineProps<{\n /** Controlled value (v-model). */\n modelValue?: string;\n size?: TextFieldSize;\n label?: string;\n hint?: string;\n /** Error message (string) or boolean error state. */\n error?: string | boolean;\n required?: boolean;\n clearable?: boolean;\n disabled?: boolean;\n id?: string;\n placeholder?: string;\n type?: string;\n clearLabel?: string;\n }>(),\n {\n modelValue: '',\n size: 'm',\n required: false,\n clearable: false,\n disabled: false,\n type: 'text',\n clearLabel: 'Очистить',\n },\n);\n\nconst emit = defineEmits<{ 'update:modelValue': [value: string]; clear: [] }>();\n\nconst inputRef = ref<HTMLInputElement>();\nconst inputId = computed(() => props.id ?? createId('ik-tf'));\nconst errText = computed(() => (typeof props.error === 'string' ? props.error : null));\nconst isError = computed(() => Boolean(props.error));\nconst showClear = computed(\n () => props.clearable && !props.disabled && (props.modelValue ?? '').length > 0,\n);\nconst fieldCls = computed(() =>\n cx(\n 'ik-tf-field',\n `ik-tf-${props.size}`,\n isError.value && 'is-error',\n props.disabled && 'is-disabled',\n ),\n);\nconst describedBy = computed(() =>\n errText.value || props.hint ? `${inputId.value}-msg` : undefined,\n);\n\nfunction onInput(e: Event) {\n emit('update:modelValue', (e.target as HTMLInputElement).value);\n}\n\nfunction onClear() {\n emit('update:modelValue', '');\n emit('clear');\n inputRef.value?.focus();\n}\n</script>\n\n<template>\n <div class=\"ik-tf-wrap\">\n <label v-if=\"label\" class=\"ik-tf-label\" :for=\"inputId\">\n {{ label }}\n <span v-if=\"required\" class=\"ik-tf-req\" aria-hidden=\"true\">*</span>\n </label>\n <div :class=\"fieldCls\">\n <span v-if=\"$slots.iconBefore\" class=\"ik-tf-ico\"><slot name=\"iconBefore\" /></span>\n <input\n :id=\"inputId\"\n ref=\"inputRef\"\n class=\"ik-tf-input\"\n :type=\"type\"\n :value=\"modelValue\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :aria-invalid=\"isError || undefined\"\n :aria-describedby=\"describedBy\"\n @input=\"onInput\"\n />\n <button\n v-if=\"showClear\"\n type=\"button\"\n class=\"ik-tf-clear\"\n :aria-label=\"clearLabel\"\n @click=\"onClear\"\n >\n <svg\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.6\"\n stroke-linecap=\"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 <div\n v-if=\"errText || hint\"\n :id=\"`${inputId}-msg`\"\n :class=\"cx('ik-tf-msg', isError && 'is-error')\"\n >\n {{ errText || hint }}\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nexport type TextFieldSize = 's' | 'm' | 'l';\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref } from 'vue';\nimport { createId } from '@iskra-ui/core';\nimport { cx } from '../utils/cx.js';\n\nconst props = withDefaults(\n defineProps<{\n /** Controlled value (v-model). */\n modelValue?: string;\n size?: TextFieldSize;\n label?: string;\n hint?: string;\n /** Error message (string) or boolean error state. */\n error?: string | boolean;\n required?: boolean;\n clearable?: boolean;\n disabled?: boolean;\n id?: string;\n placeholder?: string;\n type?: string;\n clearLabel?: string;\n }>(),\n {\n modelValue: '',\n size: 'm',\n required: false,\n clearable: false,\n disabled: false,\n type: 'text',\n clearLabel: 'Очистить',\n },\n);\n\nconst emit = defineEmits<{ 'update:modelValue': [value: string]; clear: [] }>();\n\nconst inputRef = ref<HTMLInputElement>();\nconst inputId = computed(() => props.id ?? createId('ik-tf'));\nconst errText = computed(() => (typeof props.error === 'string' ? props.error : null));\nconst isError = computed(() => Boolean(props.error));\nconst showClear = computed(\n () => props.clearable && !props.disabled && (props.modelValue ?? '').length > 0,\n);\nconst fieldCls = computed(() =>\n cx(\n 'ik-tf-field',\n `ik-tf-${props.size}`,\n isError.value && 'is-error',\n props.disabled && 'is-disabled',\n ),\n);\nconst describedBy = computed(() =>\n errText.value || props.hint ? `${inputId.value}-msg` : undefined,\n);\n\nfunction onInput(e: Event) {\n emit('update:modelValue', (e.target as HTMLInputElement).value);\n}\n\nfunction onClear() {\n emit('update:modelValue', '');\n emit('clear');\n inputRef.value?.focus();\n}\n</script>\n\n<template>\n <div class=\"ik-tf-wrap\">\n <label v-if=\"label\" class=\"ik-tf-label\" :for=\"inputId\">\n {{ label }}\n <span v-if=\"required\" class=\"ik-tf-req\" aria-hidden=\"true\">*</span>\n </label>\n <div :class=\"fieldCls\">\n <span v-if=\"$slots.iconBefore\" class=\"ik-tf-ico\"><slot name=\"iconBefore\" /></span>\n <input\n :id=\"inputId\"\n ref=\"inputRef\"\n class=\"ik-tf-input\"\n :type=\"type\"\n :value=\"modelValue\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :aria-invalid=\"isError || undefined\"\n :aria-describedby=\"describedBy\"\n @input=\"onInput\"\n />\n <button\n v-if=\"showClear\"\n type=\"button\"\n class=\"ik-tf-clear\"\n :aria-label=\"clearLabel\"\n @click=\"onClear\"\n >\n <svg\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.6\"\n stroke-linecap=\"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 <div\n v-if=\"errText || hint\"\n :id=\"`${inputId}-msg`\"\n :class=\"cx('ik-tf-msg', isError && 'is-error')\"\n >\n {{ errText || hint }}\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nexport interface TabItem {\n value: string;\n label: string;\n content?: string;\n disabled?: boolean;\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport { createId, createTabsIds, firstEnabledValue, getNextTabValue } from '@iskra-ui/core';\n\nconst props = withDefaults(\n defineProps<{\n items: TabItem[];\n /** Selected tab value (v-model). */\n modelValue?: string;\n defaultValue?: string;\n ariaLabel?: string;\n }>(),\n {},\n);\n\nconst emit = defineEmits<{ 'update:modelValue': [value: string] }>();\n\nconst baseId = createId('ik-tabs');\nconst ids = createTabsIds(baseId);\nconst internal = ref(props.modelValue ?? props.defaultValue ?? firstEnabledValue(props.items));\nwatch(\n () => props.modelValue,\n (v) => {\n if (v != null) internal.value = v;\n },\n);\nconst current = computed(() => props.modelValue ?? internal.value);\n\nconst tabEls = ref<Record<string, HTMLButtonElement | null>>({});\nfunction setTabEl(value: string, el: Element | null) {\n tabEls.value[value] = el as HTMLButtonElement | null;\n}\n\nfunction select(value: string) {\n internal.value = value;\n emit('update:modelValue', value);\n}\n\nfunction onKeydown(e: KeyboardEvent, value: string) {\n const next = getNextTabValue(props.items, value, e.key);\n if (next) {\n e.preventDefault();\n select(next);\n tabEls.value[next]?.focus();\n }\n}\n</script>\n\n<template>\n <div class=\"ik-tabs\">\n <div class=\"ik-tabs-list\" role=\"tablist\" :aria-label=\"ariaLabel\">\n <button\n v-for=\"item in items\"\n :key=\"item.value\"\n :ref=\"(el) => setTabEl(item.value, el as Element | null)\"\n type=\"button\"\n role=\"tab\"\n :id=\"ids.tab(item.value)\"\n :aria-selected=\"item.value === current\"\n :aria-controls=\"ids.panel(item.value)\"\n :tabindex=\"item.value === current ? 0 : -1\"\n :disabled=\"item.disabled\"\n class=\"ik-tabs-tab\"\n @click=\"select(item.value)\"\n @keydown=\"(e) => onKeydown(e, item.value)\"\n >\n {{ item.label }}\n </button>\n </div>\n <div\n v-for=\"item in items\"\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 class=\"ik-tabs-panel\"\n >\n <slot v-if=\"item.value === current\" :name=\"item.value\">{{ item.content }}</slot>\n </div>\n </div>\n</template>\n","<script lang=\"ts\">\nexport interface TabItem {\n value: string;\n label: string;\n content?: string;\n disabled?: boolean;\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from 'vue';\nimport { createId, createTabsIds, firstEnabledValue, getNextTabValue } from '@iskra-ui/core';\n\nconst props = withDefaults(\n defineProps<{\n items: TabItem[];\n /** Selected tab value (v-model). */\n modelValue?: string;\n defaultValue?: string;\n ariaLabel?: string;\n }>(),\n {},\n);\n\nconst emit = defineEmits<{ 'update:modelValue': [value: string] }>();\n\nconst baseId = createId('ik-tabs');\nconst ids = createTabsIds(baseId);\nconst internal = ref(props.modelValue ?? props.defaultValue ?? firstEnabledValue(props.items));\nwatch(\n () => props.modelValue,\n (v) => {\n if (v != null) internal.value = v;\n },\n);\nconst current = computed(() => props.modelValue ?? internal.value);\n\nconst tabEls = ref<Record<string, HTMLButtonElement | null>>({});\nfunction setTabEl(value: string, el: Element | null) {\n tabEls.value[value] = el as HTMLButtonElement | null;\n}\n\nfunction select(value: string) {\n internal.value = value;\n emit('update:modelValue', value);\n}\n\nfunction onKeydown(e: KeyboardEvent, value: string) {\n const next = getNextTabValue(props.items, value, e.key);\n if (next) {\n e.preventDefault();\n select(next);\n tabEls.value[next]?.focus();\n }\n}\n</script>\n\n<template>\n <div class=\"ik-tabs\">\n <div class=\"ik-tabs-list\" role=\"tablist\" :aria-label=\"ariaLabel\">\n <button\n v-for=\"item in items\"\n :key=\"item.value\"\n :ref=\"(el) => setTabEl(item.value, el as Element | null)\"\n type=\"button\"\n role=\"tab\"\n :id=\"ids.tab(item.value)\"\n :aria-selected=\"item.value === current\"\n :aria-controls=\"ids.panel(item.value)\"\n :tabindex=\"item.value === current ? 0 : -1\"\n :disabled=\"item.disabled\"\n class=\"ik-tabs-tab\"\n @click=\"select(item.value)\"\n @keydown=\"(e) => onKeydown(e, item.value)\"\n >\n {{ item.label }}\n </button>\n </div>\n <div\n v-for=\"item in items\"\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 class=\"ik-tabs-panel\"\n >\n <slot v-if=\"item.value === current\" :name=\"item.value\">{{ item.content }}</slot>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Join truthy class fragments — mirrors the React package's `cx`. */
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,sEAAsE;AACtE,wBAAgB,EAAE,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,MAAM,CAE7E"}
package/dist/vue.css ADDED
@@ -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*/
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@iskra-ui/vue",
3
+ "version": "0.1.0",
4
+ "description": "Искра.DCI Vue 3 component library — API parity with @iskra-ui/react over a shared headless core and token layer.",
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
+ "vue": ">=3.4"
25
+ },
26
+ "dependencies": {
27
+ "@iskra-ui/core": "0.1.0",
28
+ "@iskra-ui/icons": "0.1.0"
29
+ },
30
+ "devDependencies": {
31
+ "@types/node": "^22.0.0",
32
+ "@vitejs/plugin-vue": "^6.0.0",
33
+ "@vue/test-utils": "^2.4.6",
34
+ "jsdom": "^29.0.0",
35
+ "typescript": "^6.0.0",
36
+ "vite": "^8.0.0",
37
+ "vitest": "^4.1.0",
38
+ "vue": "^3.5.13",
39
+ "vue-tsc": "^3.3.0",
40
+ "@iskra-ui/react": "0.1.0",
41
+ "@iskra-ui/styles": "0.1.0",
42
+ "@iskra-ui/tokens": "0.1.0",
43
+ "@iskra-ui/tsconfig": "0.1.0"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public",
47
+ "provenance": true
48
+ },
49
+ "scripts": {
50
+ "build": "vite build && vue-tsc -p tsconfig.build.json --emitDeclarationOnly",
51
+ "dev": "vite build --watch",
52
+ "typecheck": "vue-tsc --noEmit -p tsconfig.json",
53
+ "test": "vitest run"
54
+ }
55
+ }