jvetrau-ds 0.2.13 → 0.2.14

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 (145) hide show
  1. package/components/attach/attach.cjs +32 -14
  2. package/components/attach/attach.cjs.map +1 -1
  3. package/components/attach/attach.css +65 -35
  4. package/components/attach/attach.js +28 -14
  5. package/components/attach/attach.js.map +1 -1
  6. package/components/attach/index.d.ts +1 -1
  7. package/components/index.d.ts +1 -1
  8. package/index.d.ts +1 -1
  9. package/package.json +1 -1
  10. package/styles.css +65 -35
  11. package/themes/base/desktop.css +1 -0
  12. package/themes/base/desktop.md +1 -0
  13. package/themes/base/desktop.scoped.css +1 -0
  14. package/themes/base/diagram.css +1 -0
  15. package/themes/base/diagram.md +1 -0
  16. package/themes/base/diagram.scoped.css +1 -0
  17. package/themes/base/mobile.css +1 -0
  18. package/themes/base/mobile.md +1 -0
  19. package/themes/base/mobile.scoped.css +1 -0
  20. package/themes/brandcopilot/desktop.css +1 -0
  21. package/themes/brandcopilot/desktop.md +1 -0
  22. package/themes/brandcopilot/desktop.scoped.css +1 -0
  23. package/themes/brandcopilot/diagram.css +1 -0
  24. package/themes/brandcopilot/diagram.md +1 -0
  25. package/themes/brandcopilot/diagram.scoped.css +1 -0
  26. package/themes/brandcopilot/mobile.css +1 -0
  27. package/themes/brandcopilot/mobile.md +1 -0
  28. package/themes/brandcopilot/mobile.scoped.css +1 -0
  29. package/themes/dmpatterns/desktop.css +1 -0
  30. package/themes/dmpatterns/desktop.md +1 -0
  31. package/themes/dmpatterns/desktop.scoped.css +1 -0
  32. package/themes/dmpatterns/diagram.css +1 -0
  33. package/themes/dmpatterns/diagram.md +1 -0
  34. package/themes/dmpatterns/diagram.scoped.css +1 -0
  35. package/themes/dmpatterns/mobile.css +1 -0
  36. package/themes/dmpatterns/mobile.md +1 -0
  37. package/themes/dmpatterns/mobile.scoped.css +1 -0
  38. package/themes/pdigest/desktop.css +1 -0
  39. package/themes/pdigest/desktop.md +1 -0
  40. package/themes/pdigest/desktop.scoped.css +1 -0
  41. package/themes/pdigest/diagram.css +1 -0
  42. package/themes/pdigest/diagram.md +1 -0
  43. package/themes/pdigest/diagram.scoped.css +1 -0
  44. package/themes/pdigest/mobile.css +1 -0
  45. package/themes/pdigest/mobile.md +1 -0
  46. package/themes/pdigest/mobile.scoped.css +1 -0
  47. package/themes/redesigntrack/desktop.css +1 -0
  48. package/themes/redesigntrack/desktop.md +1 -0
  49. package/themes/redesigntrack/desktop.scoped.css +1 -0
  50. package/themes/redesigntrack/diagram.css +1 -0
  51. package/themes/redesigntrack/diagram.md +1 -0
  52. package/themes/redesigntrack/diagram.scoped.css +1 -0
  53. package/themes/redesigntrack/mobile.css +1 -0
  54. package/themes/redesigntrack/mobile.md +1 -0
  55. package/themes/redesigntrack/mobile.scoped.css +1 -0
  56. package/tokens/runtime/tokens.base.desktop.runtime.cjs +1 -0
  57. package/tokens/runtime/tokens.base.desktop.runtime.cjs.map +1 -1
  58. package/tokens/runtime/tokens.base.desktop.runtime.d.ts +1 -0
  59. package/tokens/runtime/tokens.base.desktop.runtime.js +1 -0
  60. package/tokens/runtime/tokens.base.desktop.runtime.js.map +1 -1
  61. package/tokens/runtime/tokens.base.diagram.runtime.cjs +1 -0
  62. package/tokens/runtime/tokens.base.diagram.runtime.cjs.map +1 -1
  63. package/tokens/runtime/tokens.base.diagram.runtime.d.ts +1 -0
  64. package/tokens/runtime/tokens.base.diagram.runtime.js +1 -0
  65. package/tokens/runtime/tokens.base.diagram.runtime.js.map +1 -1
  66. package/tokens/runtime/tokens.base.mobile.runtime.cjs +1 -0
  67. package/tokens/runtime/tokens.base.mobile.runtime.cjs.map +1 -1
  68. package/tokens/runtime/tokens.base.mobile.runtime.d.ts +1 -0
  69. package/tokens/runtime/tokens.base.mobile.runtime.js +1 -0
  70. package/tokens/runtime/tokens.base.mobile.runtime.js.map +1 -1
  71. package/tokens/runtime/tokens.brandcopilot.desktop.runtime.cjs +1 -0
  72. package/tokens/runtime/tokens.brandcopilot.desktop.runtime.cjs.map +1 -1
  73. package/tokens/runtime/tokens.brandcopilot.desktop.runtime.d.ts +1 -0
  74. package/tokens/runtime/tokens.brandcopilot.desktop.runtime.js +1 -0
  75. package/tokens/runtime/tokens.brandcopilot.desktop.runtime.js.map +1 -1
  76. package/tokens/runtime/tokens.brandcopilot.diagram.runtime.cjs +1 -0
  77. package/tokens/runtime/tokens.brandcopilot.diagram.runtime.cjs.map +1 -1
  78. package/tokens/runtime/tokens.brandcopilot.diagram.runtime.d.ts +1 -0
  79. package/tokens/runtime/tokens.brandcopilot.diagram.runtime.js +1 -0
  80. package/tokens/runtime/tokens.brandcopilot.diagram.runtime.js.map +1 -1
  81. package/tokens/runtime/tokens.brandcopilot.mobile.runtime.cjs +1 -0
  82. package/tokens/runtime/tokens.brandcopilot.mobile.runtime.cjs.map +1 -1
  83. package/tokens/runtime/tokens.brandcopilot.mobile.runtime.d.ts +1 -0
  84. package/tokens/runtime/tokens.brandcopilot.mobile.runtime.js +1 -0
  85. package/tokens/runtime/tokens.brandcopilot.mobile.runtime.js.map +1 -1
  86. package/tokens/runtime/tokens.dmpatterns.desktop.runtime.cjs +1 -0
  87. package/tokens/runtime/tokens.dmpatterns.desktop.runtime.cjs.map +1 -1
  88. package/tokens/runtime/tokens.dmpatterns.desktop.runtime.d.ts +1 -0
  89. package/tokens/runtime/tokens.dmpatterns.desktop.runtime.js +1 -0
  90. package/tokens/runtime/tokens.dmpatterns.desktop.runtime.js.map +1 -1
  91. package/tokens/runtime/tokens.dmpatterns.diagram.runtime.cjs +1 -0
  92. package/tokens/runtime/tokens.dmpatterns.diagram.runtime.cjs.map +1 -1
  93. package/tokens/runtime/tokens.dmpatterns.diagram.runtime.d.ts +1 -0
  94. package/tokens/runtime/tokens.dmpatterns.diagram.runtime.js +1 -0
  95. package/tokens/runtime/tokens.dmpatterns.diagram.runtime.js.map +1 -1
  96. package/tokens/runtime/tokens.dmpatterns.mobile.runtime.cjs +1 -0
  97. package/tokens/runtime/tokens.dmpatterns.mobile.runtime.cjs.map +1 -1
  98. package/tokens/runtime/tokens.dmpatterns.mobile.runtime.d.ts +1 -0
  99. package/tokens/runtime/tokens.dmpatterns.mobile.runtime.js +1 -0
  100. package/tokens/runtime/tokens.dmpatterns.mobile.runtime.js.map +1 -1
  101. package/tokens/runtime/tokens.pdigest.desktop.runtime.cjs +1 -0
  102. package/tokens/runtime/tokens.pdigest.desktop.runtime.cjs.map +1 -1
  103. package/tokens/runtime/tokens.pdigest.desktop.runtime.d.ts +1 -0
  104. package/tokens/runtime/tokens.pdigest.desktop.runtime.js +1 -0
  105. package/tokens/runtime/tokens.pdigest.desktop.runtime.js.map +1 -1
  106. package/tokens/runtime/tokens.pdigest.diagram.runtime.cjs +1 -0
  107. package/tokens/runtime/tokens.pdigest.diagram.runtime.cjs.map +1 -1
  108. package/tokens/runtime/tokens.pdigest.diagram.runtime.d.ts +1 -0
  109. package/tokens/runtime/tokens.pdigest.diagram.runtime.js +1 -0
  110. package/tokens/runtime/tokens.pdigest.diagram.runtime.js.map +1 -1
  111. package/tokens/runtime/tokens.pdigest.mobile.runtime.cjs +1 -0
  112. package/tokens/runtime/tokens.pdigest.mobile.runtime.cjs.map +1 -1
  113. package/tokens/runtime/tokens.pdigest.mobile.runtime.d.ts +1 -0
  114. package/tokens/runtime/tokens.pdigest.mobile.runtime.js +1 -0
  115. package/tokens/runtime/tokens.pdigest.mobile.runtime.js.map +1 -1
  116. package/tokens/runtime/tokens.redesigntrack.desktop.runtime.cjs +1 -0
  117. package/tokens/runtime/tokens.redesigntrack.desktop.runtime.cjs.map +1 -1
  118. package/tokens/runtime/tokens.redesigntrack.desktop.runtime.d.ts +1 -0
  119. package/tokens/runtime/tokens.redesigntrack.desktop.runtime.js +1 -0
  120. package/tokens/runtime/tokens.redesigntrack.desktop.runtime.js.map +1 -1
  121. package/tokens/runtime/tokens.redesigntrack.diagram.runtime.cjs +1 -0
  122. package/tokens/runtime/tokens.redesigntrack.diagram.runtime.cjs.map +1 -1
  123. package/tokens/runtime/tokens.redesigntrack.diagram.runtime.d.ts +1 -0
  124. package/tokens/runtime/tokens.redesigntrack.diagram.runtime.js +1 -0
  125. package/tokens/runtime/tokens.redesigntrack.diagram.runtime.js.map +1 -1
  126. package/tokens/runtime/tokens.redesigntrack.mobile.runtime.cjs +1 -0
  127. package/tokens/runtime/tokens.redesigntrack.mobile.runtime.cjs.map +1 -1
  128. package/tokens/runtime/tokens.redesigntrack.mobile.runtime.d.ts +1 -0
  129. package/tokens/runtime/tokens.redesigntrack.mobile.runtime.js +1 -0
  130. package/tokens/runtime/tokens.redesigntrack.mobile.runtime.js.map +1 -1
  131. package/tokens/themes/base/dist/desktop.json +8 -0
  132. package/tokens/themes/base/dist/diagram.json +8 -0
  133. package/tokens/themes/base/dist/mobile.json +8 -0
  134. package/tokens/themes/brandcopilot/dist/desktop.json +8 -0
  135. package/tokens/themes/brandcopilot/dist/diagram.json +8 -0
  136. package/tokens/themes/brandcopilot/dist/mobile.json +8 -0
  137. package/tokens/themes/dmpatterns/dist/desktop.json +8 -0
  138. package/tokens/themes/dmpatterns/dist/diagram.json +8 -0
  139. package/tokens/themes/dmpatterns/dist/mobile.json +8 -0
  140. package/tokens/themes/pdigest/dist/desktop.json +8 -0
  141. package/tokens/themes/pdigest/dist/diagram.json +8 -0
  142. package/tokens/themes/pdigest/dist/mobile.json +8 -0
  143. package/tokens/themes/redesigntrack/dist/desktop.json +8 -0
  144. package/tokens/themes/redesigntrack/dist/diagram.json +8 -0
  145. package/tokens/themes/redesigntrack/dist/mobile.json +8 -0
@@ -2,8 +2,13 @@
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  require('./attach.css');
5
+ var Button = require('../button');
5
6
  var classnames = require('../helpers/classnames');
6
7
 
8
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
+
10
+ var Button__default = /*#__PURE__*/_interopDefault(Button);
11
+
7
12
  function isImageAttach(item) {
8
13
  return item.mimeType?.startsWith("image/") ?? false;
9
14
  }
@@ -15,12 +20,13 @@ function formatFileSize(sizeBytes) {
15
20
  return "Size unknown";
16
21
  }
17
22
  if (sizeBytes < 1024) {
18
- return `${sizeBytes} B`;
23
+ return `${sizeBytes} \u0411`;
19
24
  }
20
25
  if (sizeBytes < 1024 * 1024) {
21
- return `${Math.round(sizeBytes / 1024)} KB`;
26
+ return `${Math.round(sizeBytes / 1024)} \u041A\u0411`;
22
27
  }
23
- return `${(sizeBytes / 1024 / 1024).toFixed(1)} MB`;
28
+ const megabytes = (sizeBytes / 1024 / 1024).toFixed(1).replace(".", ",");
29
+ return `${megabytes} \u041C\u0411`;
24
30
  }
25
31
  function getLinkHostname(url) {
26
32
  try {
@@ -40,7 +46,11 @@ const Attach = ({
40
46
  if (items.length === 0) {
41
47
  return null;
42
48
  }
43
- const classes = classnames.classnames("attach", className, {});
49
+ const classes = classnames.classnames(
50
+ "attach",
51
+ className,
52
+ {}
53
+ );
44
54
  return /* @__PURE__ */ jsxRuntime.jsx(
45
55
  "div",
46
56
  {
@@ -49,12 +59,20 @@ const Attach = ({
49
59
  children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "attach__list", children: items.map((item) => {
50
60
  const isLink = isLinkAttach(item);
51
61
  const isImage = !isLink && isImageAttach(item);
52
- const itemClasses = classnames.classnames("attach__item", {
53
- "attach__item--link": isLink,
54
- "attach__item--image": isImage,
55
- "attach__item--file": !isLink && !isImage
56
- });
57
- const meta = isLink ? getLinkHostname(item.url) : formatFileSize(item.sizeBytes);
62
+ const itemClasses = classnames.classnames(
63
+ "attach__item",
64
+ "",
65
+ {
66
+ "attach__item--link": isLink,
67
+ "attach__item--image": isImage,
68
+ "attach__item--file": !isLink && !isImage
69
+ }
70
+ );
71
+ const meta = isLink ? getLinkHostname(
72
+ item.url
73
+ ) : formatFileSize(
74
+ item.sizeBytes
75
+ );
58
76
  return /* @__PURE__ */ jsxRuntime.jsxs(
59
77
  "li",
60
78
  {
@@ -81,13 +99,13 @@ const Attach = ({
81
99
  }
82
100
  ),
83
101
  onRemove && /* @__PURE__ */ jsxRuntime.jsx(
84
- "button",
102
+ Button__default.default,
85
103
  {
104
+ mode: "toolbar",
86
105
  className: "attach__remove",
87
- type: "button",
106
+ icon: "close",
88
107
  "aria-label": `${removeLabel}: ${item.name}`,
89
- onClick: () => onRemove(item.id),
90
- children: removeLabel
108
+ onClick: () => onRemove(item.id)
91
109
  }
92
110
  )
93
111
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/attach/attach.tsx"],"names":["classnames","jsx","jsxs"],"mappings":"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","file":"attach.cjs","sourcesContent":["import React from 'react';\nimport './attach.css';\nimport { classnames } from '../helpers/classnames';\n\nexport type AttachItemKind = 'file' | 'link';\n\nexport interface AttachItem {\n id: string;\n name: string;\n url: string;\n kind?: AttachItemKind;\n mimeType?: string;\n sizeBytes?: number;\n}\n\nexport interface AttachProps\n extends React.HTMLAttributes<HTMLDivElement> {\n items: AttachItem[];\n onRemove?: (id: string) => void;\n removeLabel?: string;\n emptyLabel?: string;\n}\n\nfunction isImageAttach(item: AttachItem) {\n return item.mimeType?.startsWith('image/') ?? false;\n}\n\nfunction isLinkAttach(item: AttachItem) {\n return item.kind === 'link';\n}\n\nfunction formatFileSize(sizeBytes?: number) {\n if (sizeBytes === undefined) {\n return 'Size unknown';\n }\n\n if (sizeBytes < 1024) {\n return `${sizeBytes} B`;\n }\n\n if (sizeBytes < 1024 * 1024) {\n return `${Math.round(sizeBytes / 1024)} KB`;\n }\n\n return `${(sizeBytes / 1024 / 1024).toFixed(1)} MB`;\n}\n\nfunction getLinkHostname(url: string) {\n try {\n return new URL(url).hostname.replace(/^www\\./u, '');\n } catch {\n return url;\n }\n}\n\nconst Attach: React.FC<AttachProps> = ({\n items,\n onRemove,\n removeLabel = 'Удалить',\n emptyLabel,\n className = '',\n ...props\n}) => {\n if (items.length === 0) {\n return null;\n }\n\n const classes = classnames('attach', className, {});\n\n return (\n <div\n className={classes}\n {...props}\n >\n <ul className=\"attach__list\">\n {items.map((item) => {\n const isLink = isLinkAttach(item);\n const isImage = !isLink && isImageAttach(item);\n\n const itemClasses = classnames('attach__item', {\n 'attach__item--link': isLink,\n 'attach__item--image': isImage,\n 'attach__item--file': !isLink && !isImage,\n });\n\n const meta = isLink\n ? getLinkHostname(item.url)\n : formatFileSize(item.sizeBytes);\n\n return (\n <li\n key={item.id}\n className={itemClasses}\n >\n <a\n className=\"attach__link\"\n href={item.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {isImage ? (\n <img\n className=\"attach__preview\"\n src={item.url}\n alt={item.name}\n />\n ) : (\n <span className=\"attach__file\">\n <span className=\"attach__name\">\n {item.name}\n </span>\n\n <span className=\"attach__meta\">\n {meta}\n </span>\n </span>\n )}\n </a>\n\n {onRemove && (\n <button\n className=\"attach__remove\"\n type=\"button\"\n aria-label={`${removeLabel}: ${item.name}`}\n onClick={() => onRemove(item.id)}\n >\n {removeLabel}\n </button>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n );\n};\n\nexport default Attach;"]}
1
+ {"version":3,"sources":["../../../src/components/attach/attach.tsx"],"names":["classnames","jsx","jsxs","Button"],"mappings":"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","file":"attach.cjs","sourcesContent":["import React from 'react';\n\nimport './attach.css';\nimport Button from '../button';\nimport { classnames } from '../helpers/classnames';\n\nexport type AttachItemKind = 'file' | 'link';\n\nexport interface AttachItem {\n id: string;\n name: string;\n url: string;\n kind?: AttachItemKind;\n mimeType?: string;\n sizeBytes?: number;\n}\n\nexport interface AttachProps\n extends React.HTMLAttributes<HTMLDivElement> {\n items: AttachItem[];\n onRemove?: (id: string) => void;\n removeLabel?: string;\n emptyLabel?: string;\n}\n\nfunction isImageAttach(item: AttachItem) {\n return item.mimeType?.startsWith('image/') ?? false;\n}\n\nfunction isLinkAttach(item: AttachItem) {\n return item.kind === 'link';\n}\n\nfunction formatFileSize(sizeBytes?: number) {\n if (sizeBytes === undefined) {\n return 'Size unknown';\n }\n\n if (sizeBytes < 1024) {\n return `${sizeBytes} Б`;\n }\n\n if (sizeBytes < 1024 * 1024) {\n return `${Math.round(sizeBytes / 1024)} КБ`;\n }\n\n const megabytes = (\n sizeBytes /\n 1024 /\n 1024\n )\n .toFixed(1)\n .replace('.', ',');\n\n return `${megabytes} МБ`;\n}\n\nfunction getLinkHostname(url: string) {\n try {\n return new URL(url).hostname.replace(/^www\\./u, '');\n } catch {\n return url;\n }\n}\n\nconst Attach: React.FC<AttachProps> = ({\n items,\n onRemove,\n removeLabel = 'Удалить',\n emptyLabel,\n className = '',\n ...props\n}) => {\n if (items.length === 0) {\n return null;\n }\n\n const classes = classnames(\n 'attach',\n className,\n {},\n );\n\n return (\n <div\n className={classes}\n {...props}\n >\n <ul className=\"attach__list\">\n {items.map((item) => {\n const isLink =\n isLinkAttach(item);\n\n const isImage =\n !isLink &&\n isImageAttach(item);\n\n const itemClasses =\n classnames(\n 'attach__item',\n '',\n {\n 'attach__item--link':\n isLink,\n 'attach__item--image':\n isImage,\n 'attach__item--file':\n !isLink &&\n !isImage,\n },\n );\n\n const meta = isLink\n ? getLinkHostname(\n item.url,\n )\n : formatFileSize(\n item.sizeBytes,\n );\n\n return (\n <li\n key={item.id}\n className={itemClasses}\n >\n <a\n className=\"attach__link\"\n href={item.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {isImage ? (\n <img\n className=\"attach__preview\"\n src={item.url}\n alt={item.name}\n />\n ) : (\n <span className=\"attach__file\">\n <span className=\"attach__name\">\n {item.name}\n </span>\n\n <span className=\"attach__meta\">\n {meta}\n </span>\n </span>\n )}\n </a>\n\n {onRemove && (\n <Button\n mode=\"toolbar\"\n className=\"attach__remove\"\n icon=\"close\"\n aria-label={`${removeLabel}: ${item.name}`}\n onClick={() =>\n onRemove(item.id)\n }\n />\n )}\n </li>\n );\n })}\n </ul>\n </div>\n );\n};\n\nexport default Attach;\n"]}
@@ -1,10 +1,9 @@
1
1
  .attach {
2
2
  /* color */
3
3
  --attachment-color: var(--color-text);
4
- --attachment-item-bg: var(--color-control);
5
- --attachment-item-color: var(--color-text-control);
6
- --attachment-border-color: var(--color-line);
7
- --attachment-item-meta-color: var(--color-text-note);
4
+ --attachment-item-bg: var(--color-bg-media);
5
+ --attachment-item-color: var(--color-text);
6
+ --attachment-item-meta-color: var(--color-text);
8
7
 
9
8
  color: var(--attachment-color);
10
9
 
@@ -22,15 +21,16 @@
22
21
  letter-spacing: var(--attachment-letter-spacing);
23
22
 
24
23
  /* size */
25
- --attachment-gap: var(--margin-control);
26
- --attachment-item-gap: var(--margin-icon);
27
- --attachment-item-padding: var(--padding-control-vert);
28
- --attachment-preview-max-width: 240px;
29
- --attachment-preview-max-height: 180px;
24
+ --attachment-gap: var(--margin-container);
25
+ --attachment-item-padding: var(--padding-container);
26
+ --attachment-remove-offset: var(--margin-container);
27
+ --attachment-aspect-ratio: 9 / 6;
28
+
29
+ width: 100%;
30
+ min-width: 0;
30
31
 
31
32
  /* border */
32
- --attachment-radius: var(--radius-control);
33
- --attachment-border-width: var(--size-border-width-base);
33
+ --attachment-radius: var(--radius-container);
34
34
 
35
35
  /* depth */
36
36
 
@@ -43,9 +43,13 @@
43
43
  /* typography */
44
44
 
45
45
  /* size */
46
- display: flex;
47
- flex-direction: column;
46
+ display: grid;
47
+ grid-template-columns:
48
+ repeat(3, minmax(0, 1fr));
48
49
  gap: var(--attachment-gap);
50
+
51
+ width: 100%;
52
+ min-width: 0;
49
53
  margin: 0;
50
54
  padding: 0;
51
55
 
@@ -65,17 +69,14 @@
65
69
  /* typography */
66
70
 
67
71
  /* size */
68
- display: flex;
69
- align-items: center;
70
- justify-content: space-between;
71
- gap: var(--attachment-item-gap);
72
- padding: var(--attachment-item-padding);
72
+ position: relative;
73
+ min-width: 0;
74
+ aspect-ratio:
75
+ var(--attachment-aspect-ratio);
76
+
77
+ overflow: hidden;
73
78
 
74
79
  /* border */
75
- border:
76
- var(--attachment-border-width)
77
- solid
78
- var(--attachment-border-color);
79
80
  border-radius: var(--attachment-radius);
80
81
 
81
82
  /* depth */
@@ -91,6 +92,9 @@
91
92
  text-decoration: none;
92
93
 
93
94
  /* size */
95
+ display: block;
96
+ width: 100%;
97
+ height: 100%;
94
98
  min-width: 0;
95
99
 
96
100
  /* border */
@@ -100,6 +104,25 @@
100
104
  /* motion */
101
105
  }
102
106
 
107
+ .attach__item--file .attach__link,
108
+ .attach__item--link .attach__link {
109
+ /* color */
110
+
111
+ /* typography */
112
+
113
+ /* size */
114
+ display: flex;
115
+ align-items: flex-end;
116
+
117
+ padding: var(--attachment-item-padding);
118
+
119
+ /* border */
120
+
121
+ /* depth */
122
+
123
+ /* motion */
124
+ }
125
+
103
126
  .attach__link:hover .attach__name {
104
127
  /* color */
105
128
 
@@ -122,12 +145,13 @@
122
145
 
123
146
  /* size */
124
147
  display: block;
125
- max-width: var(--attachment-preview-max-width);
126
- max-height: var(--attachment-preview-max-height);
127
- object-fit: contain;
148
+
149
+ width: 100%;
150
+ height: 100%;
151
+
152
+ object-fit: cover;
128
153
 
129
154
  /* border */
130
- border-radius: var(--attachment-radius);
131
155
 
132
156
  /* depth */
133
157
 
@@ -142,6 +166,8 @@
142
166
  /* size */
143
167
  display: flex;
144
168
  flex-direction: column;
169
+
170
+ width: 100%;
145
171
  min-width: 0;
146
172
 
147
173
  /* border */
@@ -159,6 +185,8 @@
159
185
  white-space: nowrap;
160
186
 
161
187
  /* size */
188
+ min-width: 0;
189
+
162
190
  overflow: hidden;
163
191
 
164
192
  /* border */
@@ -173,7 +201,11 @@
173
201
  color: var(--attachment-item-meta-color);
174
202
 
175
203
  /* typography */
176
- font-size: 0.85em;
204
+ font-family: var(--font-body-family);
205
+ font-size: var(--font-body);
206
+ font-weight: var(--font-body-weight);
207
+ line-height: var(--font-body-line);
208
+ letter-spacing: var(--font-body-letter-spacing);
177
209
 
178
210
  /* size */
179
211
 
@@ -186,30 +218,28 @@
186
218
 
187
219
  .attach__remove {
188
220
  /* color */
189
- background: transparent;
190
221
  color: inherit;
191
222
 
192
223
  /* typography */
193
- font: inherit;
194
224
 
195
225
  /* size */
196
- flex-shrink: 0;
197
- padding: 0;
226
+ position: absolute;
227
+ top: var(--attachment-remove-offset);
228
+ right: var(--attachment-remove-offset);
229
+ z-index: 1;
198
230
 
199
231
  /* border */
200
- border: 0;
201
232
 
202
233
  /* depth */
203
234
 
204
235
  /* motion */
205
- cursor: pointer;
206
236
  }
207
237
 
208
- .attach__remove:hover {
238
+ .attach__item--image .attach__remove {
209
239
  /* color */
240
+ color: var(--color-contrast);
210
241
 
211
242
  /* typography */
212
- text-decoration: underline;
213
243
 
214
244
  /* size */
215
245
 
@@ -1,5 +1,6 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import './attach.css';
3
+ import Button from '../button';
3
4
  import { classnames } from '../helpers/classnames';
4
5
 
5
6
  function isImageAttach(item) {
@@ -13,12 +14,13 @@ function formatFileSize(sizeBytes) {
13
14
  return "Size unknown";
14
15
  }
15
16
  if (sizeBytes < 1024) {
16
- return `${sizeBytes} B`;
17
+ return `${sizeBytes} \u0411`;
17
18
  }
18
19
  if (sizeBytes < 1024 * 1024) {
19
- return `${Math.round(sizeBytes / 1024)} KB`;
20
+ return `${Math.round(sizeBytes / 1024)} \u041A\u0411`;
20
21
  }
21
- return `${(sizeBytes / 1024 / 1024).toFixed(1)} MB`;
22
+ const megabytes = (sizeBytes / 1024 / 1024).toFixed(1).replace(".", ",");
23
+ return `${megabytes} \u041C\u0411`;
22
24
  }
23
25
  function getLinkHostname(url) {
24
26
  try {
@@ -38,7 +40,11 @@ const Attach = ({
38
40
  if (items.length === 0) {
39
41
  return null;
40
42
  }
41
- const classes = classnames("attach", className, {});
43
+ const classes = classnames(
44
+ "attach",
45
+ className,
46
+ {}
47
+ );
42
48
  return /* @__PURE__ */ jsx(
43
49
  "div",
44
50
  {
@@ -47,12 +53,20 @@ const Attach = ({
47
53
  children: /* @__PURE__ */ jsx("ul", { className: "attach__list", children: items.map((item) => {
48
54
  const isLink = isLinkAttach(item);
49
55
  const isImage = !isLink && isImageAttach(item);
50
- const itemClasses = classnames("attach__item", {
51
- "attach__item--link": isLink,
52
- "attach__item--image": isImage,
53
- "attach__item--file": !isLink && !isImage
54
- });
55
- const meta = isLink ? getLinkHostname(item.url) : formatFileSize(item.sizeBytes);
56
+ const itemClasses = classnames(
57
+ "attach__item",
58
+ "",
59
+ {
60
+ "attach__item--link": isLink,
61
+ "attach__item--image": isImage,
62
+ "attach__item--file": !isLink && !isImage
63
+ }
64
+ );
65
+ const meta = isLink ? getLinkHostname(
66
+ item.url
67
+ ) : formatFileSize(
68
+ item.sizeBytes
69
+ );
56
70
  return /* @__PURE__ */ jsxs(
57
71
  "li",
58
72
  {
@@ -79,13 +93,13 @@ const Attach = ({
79
93
  }
80
94
  ),
81
95
  onRemove && /* @__PURE__ */ jsx(
82
- "button",
96
+ Button,
83
97
  {
98
+ mode: "toolbar",
84
99
  className: "attach__remove",
85
- type: "button",
100
+ icon: "close",
86
101
  "aria-label": `${removeLabel}: ${item.name}`,
87
- onClick: () => onRemove(item.id),
88
- children: removeLabel
102
+ onClick: () => onRemove(item.id)
89
103
  }
90
104
  )
91
105
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/attach/attach.tsx"],"names":[],"mappings":"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","file":"attach.js","sourcesContent":["import React from 'react';\nimport './attach.css';\nimport { classnames } from '../helpers/classnames';\n\nexport type AttachItemKind = 'file' | 'link';\n\nexport interface AttachItem {\n id: string;\n name: string;\n url: string;\n kind?: AttachItemKind;\n mimeType?: string;\n sizeBytes?: number;\n}\n\nexport interface AttachProps\n extends React.HTMLAttributes<HTMLDivElement> {\n items: AttachItem[];\n onRemove?: (id: string) => void;\n removeLabel?: string;\n emptyLabel?: string;\n}\n\nfunction isImageAttach(item: AttachItem) {\n return item.mimeType?.startsWith('image/') ?? false;\n}\n\nfunction isLinkAttach(item: AttachItem) {\n return item.kind === 'link';\n}\n\nfunction formatFileSize(sizeBytes?: number) {\n if (sizeBytes === undefined) {\n return 'Size unknown';\n }\n\n if (sizeBytes < 1024) {\n return `${sizeBytes} B`;\n }\n\n if (sizeBytes < 1024 * 1024) {\n return `${Math.round(sizeBytes / 1024)} KB`;\n }\n\n return `${(sizeBytes / 1024 / 1024).toFixed(1)} MB`;\n}\n\nfunction getLinkHostname(url: string) {\n try {\n return new URL(url).hostname.replace(/^www\\./u, '');\n } catch {\n return url;\n }\n}\n\nconst Attach: React.FC<AttachProps> = ({\n items,\n onRemove,\n removeLabel = 'Удалить',\n emptyLabel,\n className = '',\n ...props\n}) => {\n if (items.length === 0) {\n return null;\n }\n\n const classes = classnames('attach', className, {});\n\n return (\n <div\n className={classes}\n {...props}\n >\n <ul className=\"attach__list\">\n {items.map((item) => {\n const isLink = isLinkAttach(item);\n const isImage = !isLink && isImageAttach(item);\n\n const itemClasses = classnames('attach__item', {\n 'attach__item--link': isLink,\n 'attach__item--image': isImage,\n 'attach__item--file': !isLink && !isImage,\n });\n\n const meta = isLink\n ? getLinkHostname(item.url)\n : formatFileSize(item.sizeBytes);\n\n return (\n <li\n key={item.id}\n className={itemClasses}\n >\n <a\n className=\"attach__link\"\n href={item.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {isImage ? (\n <img\n className=\"attach__preview\"\n src={item.url}\n alt={item.name}\n />\n ) : (\n <span className=\"attach__file\">\n <span className=\"attach__name\">\n {item.name}\n </span>\n\n <span className=\"attach__meta\">\n {meta}\n </span>\n </span>\n )}\n </a>\n\n {onRemove && (\n <button\n className=\"attach__remove\"\n type=\"button\"\n aria-label={`${removeLabel}: ${item.name}`}\n onClick={() => onRemove(item.id)}\n >\n {removeLabel}\n </button>\n )}\n </li>\n );\n })}\n </ul>\n </div>\n );\n};\n\nexport default Attach;"]}
1
+ {"version":3,"sources":["../../../src/components/attach/attach.tsx"],"names":[],"mappings":"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","file":"attach.js","sourcesContent":["import React from 'react';\n\nimport './attach.css';\nimport Button from '../button';\nimport { classnames } from '../helpers/classnames';\n\nexport type AttachItemKind = 'file' | 'link';\n\nexport interface AttachItem {\n id: string;\n name: string;\n url: string;\n kind?: AttachItemKind;\n mimeType?: string;\n sizeBytes?: number;\n}\n\nexport interface AttachProps\n extends React.HTMLAttributes<HTMLDivElement> {\n items: AttachItem[];\n onRemove?: (id: string) => void;\n removeLabel?: string;\n emptyLabel?: string;\n}\n\nfunction isImageAttach(item: AttachItem) {\n return item.mimeType?.startsWith('image/') ?? false;\n}\n\nfunction isLinkAttach(item: AttachItem) {\n return item.kind === 'link';\n}\n\nfunction formatFileSize(sizeBytes?: number) {\n if (sizeBytes === undefined) {\n return 'Size unknown';\n }\n\n if (sizeBytes < 1024) {\n return `${sizeBytes} Б`;\n }\n\n if (sizeBytes < 1024 * 1024) {\n return `${Math.round(sizeBytes / 1024)} КБ`;\n }\n\n const megabytes = (\n sizeBytes /\n 1024 /\n 1024\n )\n .toFixed(1)\n .replace('.', ',');\n\n return `${megabytes} МБ`;\n}\n\nfunction getLinkHostname(url: string) {\n try {\n return new URL(url).hostname.replace(/^www\\./u, '');\n } catch {\n return url;\n }\n}\n\nconst Attach: React.FC<AttachProps> = ({\n items,\n onRemove,\n removeLabel = 'Удалить',\n emptyLabel,\n className = '',\n ...props\n}) => {\n if (items.length === 0) {\n return null;\n }\n\n const classes = classnames(\n 'attach',\n className,\n {},\n );\n\n return (\n <div\n className={classes}\n {...props}\n >\n <ul className=\"attach__list\">\n {items.map((item) => {\n const isLink =\n isLinkAttach(item);\n\n const isImage =\n !isLink &&\n isImageAttach(item);\n\n const itemClasses =\n classnames(\n 'attach__item',\n '',\n {\n 'attach__item--link':\n isLink,\n 'attach__item--image':\n isImage,\n 'attach__item--file':\n !isLink &&\n !isImage,\n },\n );\n\n const meta = isLink\n ? getLinkHostname(\n item.url,\n )\n : formatFileSize(\n item.sizeBytes,\n );\n\n return (\n <li\n key={item.id}\n className={itemClasses}\n >\n <a\n className=\"attach__link\"\n href={item.url}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {isImage ? (\n <img\n className=\"attach__preview\"\n src={item.url}\n alt={item.name}\n />\n ) : (\n <span className=\"attach__file\">\n <span className=\"attach__name\">\n {item.name}\n </span>\n\n <span className=\"attach__meta\">\n {meta}\n </span>\n </span>\n )}\n </a>\n\n {onRemove && (\n <Button\n mode=\"toolbar\"\n className=\"attach__remove\"\n icon=\"close\"\n aria-label={`${removeLabel}: ${item.name}`}\n onClick={() =>\n onRemove(item.id)\n }\n />\n )}\n </li>\n );\n })}\n </ul>\n </div>\n );\n};\n\nexport default Attach;\n"]}
@@ -1,2 +1,2 @@
1
1
  export { default } from './attach';
2
- export type { AttachItem, AttachProps, } from './attach';
2
+ export type { AttachItem, AttachItemKind, AttachProps, } from './attach';
@@ -38,7 +38,7 @@ export type { LogoProps } from './logo/logo';
38
38
  export { default as Avatar } from './avatar/avatar';
39
39
  export type { AvatarProps } from './avatar/avatar';
40
40
  export { default as Attach } from './attach/attach';
41
- export type { AttachItem, AttachProps, } from './attach/attach';
41
+ export type { AttachItem, AttachItemKind, AttachProps, } from './attach/attach';
42
42
  export { default as ActionGroup } from './action-group/action-group';
43
43
  export type { ActionGroupProps } from './action-group/action-group';
44
44
  export { default as CardGroup } from './card-group/card-group';
package/index.d.ts CHANGED
@@ -45,7 +45,7 @@ export type { LogoProps } from './components/logo';
45
45
  export { default as Avatar } from './components/avatar';
46
46
  export type { AvatarProps } from './components/avatar';
47
47
  export { default as Attach } from './components/attach';
48
- export type { AttachItem, AttachProps, } from './components/attach';
48
+ export type { AttachItem, AttachItemKind, AttachProps, } from './components/attach';
49
49
  export { default as ActionGroup } from './components/action-group';
50
50
  export type { ActionGroupProps } from './components/action-group';
51
51
  export { default as CardGroup } from './components/card-group';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jvetrau-ds",
3
- "version": "0.2.13",
3
+ "version": "0.2.14",
4
4
  "description": "Multi-brand React design system with semantic tokens",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
package/styles.css CHANGED
@@ -30,10 +30,9 @@
30
30
  .attach {
31
31
  /* color */
32
32
  --attachment-color: var(--color-text);
33
- --attachment-item-bg: var(--color-control);
34
- --attachment-item-color: var(--color-text-control);
35
- --attachment-border-color: var(--color-line);
36
- --attachment-item-meta-color: var(--color-text-note);
33
+ --attachment-item-bg: var(--color-bg-media);
34
+ --attachment-item-color: var(--color-text);
35
+ --attachment-item-meta-color: var(--color-text);
37
36
 
38
37
  color: var(--attachment-color);
39
38
 
@@ -51,15 +50,16 @@
51
50
  letter-spacing: var(--attachment-letter-spacing);
52
51
 
53
52
  /* size */
54
- --attachment-gap: var(--margin-control);
55
- --attachment-item-gap: var(--margin-icon);
56
- --attachment-item-padding: var(--padding-control-vert);
57
- --attachment-preview-max-width: 240px;
58
- --attachment-preview-max-height: 180px;
53
+ --attachment-gap: var(--margin-container);
54
+ --attachment-item-padding: var(--padding-container);
55
+ --attachment-remove-offset: var(--margin-container);
56
+ --attachment-aspect-ratio: 9 / 6;
57
+
58
+ width: 100%;
59
+ min-width: 0;
59
60
 
60
61
  /* border */
61
- --attachment-radius: var(--radius-control);
62
- --attachment-border-width: var(--size-border-width-base);
62
+ --attachment-radius: var(--radius-container);
63
63
 
64
64
  /* depth */
65
65
 
@@ -72,9 +72,13 @@
72
72
  /* typography */
73
73
 
74
74
  /* size */
75
- display: flex;
76
- flex-direction: column;
75
+ display: grid;
76
+ grid-template-columns:
77
+ repeat(3, minmax(0, 1fr));
77
78
  gap: var(--attachment-gap);
79
+
80
+ width: 100%;
81
+ min-width: 0;
78
82
  margin: 0;
79
83
  padding: 0;
80
84
 
@@ -94,17 +98,14 @@
94
98
  /* typography */
95
99
 
96
100
  /* size */
97
- display: flex;
98
- align-items: center;
99
- justify-content: space-between;
100
- gap: var(--attachment-item-gap);
101
- padding: var(--attachment-item-padding);
101
+ position: relative;
102
+ min-width: 0;
103
+ aspect-ratio:
104
+ var(--attachment-aspect-ratio);
105
+
106
+ overflow: hidden;
102
107
 
103
108
  /* border */
104
- border:
105
- var(--attachment-border-width)
106
- solid
107
- var(--attachment-border-color);
108
109
  border-radius: var(--attachment-radius);
109
110
 
110
111
  /* depth */
@@ -120,6 +121,9 @@
120
121
  text-decoration: none;
121
122
 
122
123
  /* size */
124
+ display: block;
125
+ width: 100%;
126
+ height: 100%;
123
127
  min-width: 0;
124
128
 
125
129
  /* border */
@@ -129,6 +133,25 @@
129
133
  /* motion */
130
134
  }
131
135
 
136
+ .attach__item--file .attach__link,
137
+ .attach__item--link .attach__link {
138
+ /* color */
139
+
140
+ /* typography */
141
+
142
+ /* size */
143
+ display: flex;
144
+ align-items: flex-end;
145
+
146
+ padding: var(--attachment-item-padding);
147
+
148
+ /* border */
149
+
150
+ /* depth */
151
+
152
+ /* motion */
153
+ }
154
+
132
155
  .attach__link:hover .attach__name {
133
156
  /* color */
134
157
 
@@ -151,12 +174,13 @@
151
174
 
152
175
  /* size */
153
176
  display: block;
154
- max-width: var(--attachment-preview-max-width);
155
- max-height: var(--attachment-preview-max-height);
156
- object-fit: contain;
177
+
178
+ width: 100%;
179
+ height: 100%;
180
+
181
+ object-fit: cover;
157
182
 
158
183
  /* border */
159
- border-radius: var(--attachment-radius);
160
184
 
161
185
  /* depth */
162
186
 
@@ -171,6 +195,8 @@
171
195
  /* size */
172
196
  display: flex;
173
197
  flex-direction: column;
198
+
199
+ width: 100%;
174
200
  min-width: 0;
175
201
 
176
202
  /* border */
@@ -188,6 +214,8 @@
188
214
  white-space: nowrap;
189
215
 
190
216
  /* size */
217
+ min-width: 0;
218
+
191
219
  overflow: hidden;
192
220
 
193
221
  /* border */
@@ -202,7 +230,11 @@
202
230
  color: var(--attachment-item-meta-color);
203
231
 
204
232
  /* typography */
205
- font-size: 0.85em;
233
+ font-family: var(--font-body-family);
234
+ font-size: var(--font-body);
235
+ font-weight: var(--font-body-weight);
236
+ line-height: var(--font-body-line);
237
+ letter-spacing: var(--font-body-letter-spacing);
206
238
 
207
239
  /* size */
208
240
 
@@ -215,30 +247,28 @@
215
247
 
216
248
  .attach__remove {
217
249
  /* color */
218
- background: transparent;
219
250
  color: inherit;
220
251
 
221
252
  /* typography */
222
- font: inherit;
223
253
 
224
254
  /* size */
225
- flex-shrink: 0;
226
- padding: 0;
255
+ position: absolute;
256
+ top: var(--attachment-remove-offset);
257
+ right: var(--attachment-remove-offset);
258
+ z-index: 1;
227
259
 
228
260
  /* border */
229
- border: 0;
230
261
 
231
262
  /* depth */
232
263
 
233
264
  /* motion */
234
- cursor: pointer;
235
265
  }
236
266
 
237
- .attach__remove:hover {
267
+ .attach__item--image .attach__remove {
238
268
  /* color */
269
+ color: var(--color-contrast);
239
270
 
240
271
  /* typography */
241
- text-decoration: underline;
242
272
 
243
273
  /* size */
244
274