jvetrau-ds 0.1.30 → 0.1.32

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 (161) hide show
  1. package/components/attach/attach.cjs +21 -4
  2. package/components/attach/attach.cjs.map +1 -1
  3. package/components/attach/attach.css +46 -8
  4. package/components/attach/attach.d.cts +3 -1
  5. package/components/attach/attach.d.ts +3 -1
  6. package/components/attach/attach.js +21 -4
  7. package/components/attach/attach.js.map +1 -1
  8. package/components/logo/logo.css +5 -0
  9. package/components/tag/tag.css +14 -14
  10. package/package.json +1 -1
  11. package/styles.css +65 -22
  12. package/themes/base/desktop.css +12 -7
  13. package/themes/base/desktop.md +12 -7
  14. package/themes/base/desktop.scoped.css +12 -7
  15. package/themes/base/diagram.css +12 -7
  16. package/themes/base/diagram.md +12 -7
  17. package/themes/base/diagram.scoped.css +12 -7
  18. package/themes/base/mobile.css +12 -7
  19. package/themes/base/mobile.md +12 -7
  20. package/themes/base/mobile.scoped.css +12 -7
  21. package/themes/brandcopilot/desktop.css +12 -7
  22. package/themes/brandcopilot/desktop.md +12 -7
  23. package/themes/brandcopilot/desktop.scoped.css +12 -7
  24. package/themes/brandcopilot/diagram.css +12 -7
  25. package/themes/brandcopilot/diagram.md +12 -7
  26. package/themes/brandcopilot/diagram.scoped.css +12 -7
  27. package/themes/brandcopilot/mobile.css +12 -7
  28. package/themes/brandcopilot/mobile.md +12 -7
  29. package/themes/brandcopilot/mobile.scoped.css +12 -7
  30. package/themes/dmpatterns/desktop.css +12 -7
  31. package/themes/dmpatterns/desktop.md +12 -7
  32. package/themes/dmpatterns/desktop.scoped.css +12 -7
  33. package/themes/dmpatterns/diagram.css +12 -7
  34. package/themes/dmpatterns/diagram.md +12 -7
  35. package/themes/dmpatterns/diagram.scoped.css +12 -7
  36. package/themes/dmpatterns/mobile.css +12 -7
  37. package/themes/dmpatterns/mobile.md +12 -7
  38. package/themes/dmpatterns/mobile.scoped.css +12 -7
  39. package/themes/pdigest/desktop.css +12 -7
  40. package/themes/pdigest/desktop.md +12 -7
  41. package/themes/pdigest/desktop.scoped.css +12 -7
  42. package/themes/pdigest/diagram.css +12 -7
  43. package/themes/pdigest/diagram.md +12 -7
  44. package/themes/pdigest/diagram.scoped.css +12 -7
  45. package/themes/pdigest/mobile.css +12 -7
  46. package/themes/pdigest/mobile.md +12 -7
  47. package/themes/pdigest/mobile.scoped.css +12 -7
  48. package/themes/redesigntrack/desktop.css +12 -7
  49. package/themes/redesigntrack/desktop.md +12 -7
  50. package/themes/redesigntrack/desktop.scoped.css +12 -7
  51. package/themes/redesigntrack/diagram.css +12 -7
  52. package/themes/redesigntrack/diagram.md +12 -7
  53. package/themes/redesigntrack/diagram.scoped.css +12 -7
  54. package/themes/redesigntrack/mobile.css +12 -7
  55. package/themes/redesigntrack/mobile.md +12 -7
  56. package/themes/redesigntrack/mobile.scoped.css +12 -7
  57. package/tokens/runtime/tokens.base.desktop.runtime.cjs +27 -22
  58. package/tokens/runtime/tokens.base.desktop.runtime.cjs.map +1 -1
  59. package/tokens/runtime/tokens.base.desktop.runtime.d.cts +27 -22
  60. package/tokens/runtime/tokens.base.desktop.runtime.d.ts +27 -22
  61. package/tokens/runtime/tokens.base.desktop.runtime.js +27 -22
  62. package/tokens/runtime/tokens.base.desktop.runtime.js.map +1 -1
  63. package/tokens/runtime/tokens.base.diagram.runtime.cjs +27 -22
  64. package/tokens/runtime/tokens.base.diagram.runtime.cjs.map +1 -1
  65. package/tokens/runtime/tokens.base.diagram.runtime.d.cts +27 -22
  66. package/tokens/runtime/tokens.base.diagram.runtime.d.ts +27 -22
  67. package/tokens/runtime/tokens.base.diagram.runtime.js +27 -22
  68. package/tokens/runtime/tokens.base.diagram.runtime.js.map +1 -1
  69. package/tokens/runtime/tokens.base.mobile.runtime.cjs +27 -22
  70. package/tokens/runtime/tokens.base.mobile.runtime.cjs.map +1 -1
  71. package/tokens/runtime/tokens.base.mobile.runtime.d.cts +27 -22
  72. package/tokens/runtime/tokens.base.mobile.runtime.d.ts +27 -22
  73. package/tokens/runtime/tokens.base.mobile.runtime.js +27 -22
  74. package/tokens/runtime/tokens.base.mobile.runtime.js.map +1 -1
  75. package/tokens/runtime/tokens.brandcopilot.desktop.runtime.cjs +27 -22
  76. package/tokens/runtime/tokens.brandcopilot.desktop.runtime.cjs.map +1 -1
  77. package/tokens/runtime/tokens.brandcopilot.desktop.runtime.d.cts +27 -22
  78. package/tokens/runtime/tokens.brandcopilot.desktop.runtime.d.ts +27 -22
  79. package/tokens/runtime/tokens.brandcopilot.desktop.runtime.js +27 -22
  80. package/tokens/runtime/tokens.brandcopilot.desktop.runtime.js.map +1 -1
  81. package/tokens/runtime/tokens.brandcopilot.diagram.runtime.cjs +27 -22
  82. package/tokens/runtime/tokens.brandcopilot.diagram.runtime.cjs.map +1 -1
  83. package/tokens/runtime/tokens.brandcopilot.diagram.runtime.d.cts +27 -22
  84. package/tokens/runtime/tokens.brandcopilot.diagram.runtime.d.ts +27 -22
  85. package/tokens/runtime/tokens.brandcopilot.diagram.runtime.js +27 -22
  86. package/tokens/runtime/tokens.brandcopilot.diagram.runtime.js.map +1 -1
  87. package/tokens/runtime/tokens.brandcopilot.mobile.runtime.cjs +27 -22
  88. package/tokens/runtime/tokens.brandcopilot.mobile.runtime.cjs.map +1 -1
  89. package/tokens/runtime/tokens.brandcopilot.mobile.runtime.d.cts +27 -22
  90. package/tokens/runtime/tokens.brandcopilot.mobile.runtime.d.ts +27 -22
  91. package/tokens/runtime/tokens.brandcopilot.mobile.runtime.js +27 -22
  92. package/tokens/runtime/tokens.brandcopilot.mobile.runtime.js.map +1 -1
  93. package/tokens/runtime/tokens.dmpatterns.desktop.runtime.cjs +27 -22
  94. package/tokens/runtime/tokens.dmpatterns.desktop.runtime.cjs.map +1 -1
  95. package/tokens/runtime/tokens.dmpatterns.desktop.runtime.d.cts +27 -22
  96. package/tokens/runtime/tokens.dmpatterns.desktop.runtime.d.ts +27 -22
  97. package/tokens/runtime/tokens.dmpatterns.desktop.runtime.js +27 -22
  98. package/tokens/runtime/tokens.dmpatterns.desktop.runtime.js.map +1 -1
  99. package/tokens/runtime/tokens.dmpatterns.diagram.runtime.cjs +27 -22
  100. package/tokens/runtime/tokens.dmpatterns.diagram.runtime.cjs.map +1 -1
  101. package/tokens/runtime/tokens.dmpatterns.diagram.runtime.d.cts +27 -22
  102. package/tokens/runtime/tokens.dmpatterns.diagram.runtime.d.ts +27 -22
  103. package/tokens/runtime/tokens.dmpatterns.diagram.runtime.js +27 -22
  104. package/tokens/runtime/tokens.dmpatterns.diagram.runtime.js.map +1 -1
  105. package/tokens/runtime/tokens.dmpatterns.mobile.runtime.cjs +27 -22
  106. package/tokens/runtime/tokens.dmpatterns.mobile.runtime.cjs.map +1 -1
  107. package/tokens/runtime/tokens.dmpatterns.mobile.runtime.d.cts +27 -22
  108. package/tokens/runtime/tokens.dmpatterns.mobile.runtime.d.ts +27 -22
  109. package/tokens/runtime/tokens.dmpatterns.mobile.runtime.js +27 -22
  110. package/tokens/runtime/tokens.dmpatterns.mobile.runtime.js.map +1 -1
  111. package/tokens/runtime/tokens.pdigest.desktop.runtime.cjs +27 -22
  112. package/tokens/runtime/tokens.pdigest.desktop.runtime.cjs.map +1 -1
  113. package/tokens/runtime/tokens.pdigest.desktop.runtime.d.cts +27 -22
  114. package/tokens/runtime/tokens.pdigest.desktop.runtime.d.ts +27 -22
  115. package/tokens/runtime/tokens.pdigest.desktop.runtime.js +27 -22
  116. package/tokens/runtime/tokens.pdigest.desktop.runtime.js.map +1 -1
  117. package/tokens/runtime/tokens.pdigest.diagram.runtime.cjs +27 -22
  118. package/tokens/runtime/tokens.pdigest.diagram.runtime.cjs.map +1 -1
  119. package/tokens/runtime/tokens.pdigest.diagram.runtime.d.cts +27 -22
  120. package/tokens/runtime/tokens.pdigest.diagram.runtime.d.ts +27 -22
  121. package/tokens/runtime/tokens.pdigest.diagram.runtime.js +27 -22
  122. package/tokens/runtime/tokens.pdigest.diagram.runtime.js.map +1 -1
  123. package/tokens/runtime/tokens.pdigest.mobile.runtime.cjs +27 -22
  124. package/tokens/runtime/tokens.pdigest.mobile.runtime.cjs.map +1 -1
  125. package/tokens/runtime/tokens.pdigest.mobile.runtime.d.cts +27 -22
  126. package/tokens/runtime/tokens.pdigest.mobile.runtime.d.ts +27 -22
  127. package/tokens/runtime/tokens.pdigest.mobile.runtime.js +27 -22
  128. package/tokens/runtime/tokens.pdigest.mobile.runtime.js.map +1 -1
  129. package/tokens/runtime/tokens.redesigntrack.desktop.runtime.cjs +27 -22
  130. package/tokens/runtime/tokens.redesigntrack.desktop.runtime.cjs.map +1 -1
  131. package/tokens/runtime/tokens.redesigntrack.desktop.runtime.d.cts +27 -22
  132. package/tokens/runtime/tokens.redesigntrack.desktop.runtime.d.ts +27 -22
  133. package/tokens/runtime/tokens.redesigntrack.desktop.runtime.js +27 -22
  134. package/tokens/runtime/tokens.redesigntrack.desktop.runtime.js.map +1 -1
  135. package/tokens/runtime/tokens.redesigntrack.diagram.runtime.cjs +27 -22
  136. package/tokens/runtime/tokens.redesigntrack.diagram.runtime.cjs.map +1 -1
  137. package/tokens/runtime/tokens.redesigntrack.diagram.runtime.d.cts +27 -22
  138. package/tokens/runtime/tokens.redesigntrack.diagram.runtime.d.ts +27 -22
  139. package/tokens/runtime/tokens.redesigntrack.diagram.runtime.js +27 -22
  140. package/tokens/runtime/tokens.redesigntrack.diagram.runtime.js.map +1 -1
  141. package/tokens/runtime/tokens.redesigntrack.mobile.runtime.cjs +27 -22
  142. package/tokens/runtime/tokens.redesigntrack.mobile.runtime.cjs.map +1 -1
  143. package/tokens/runtime/tokens.redesigntrack.mobile.runtime.d.cts +27 -22
  144. package/tokens/runtime/tokens.redesigntrack.mobile.runtime.d.ts +27 -22
  145. package/tokens/runtime/tokens.redesigntrack.mobile.runtime.js +27 -22
  146. package/tokens/runtime/tokens.redesigntrack.mobile.runtime.js.map +1 -1
  147. package/tokens/themes/base/dist/desktop.json +81 -41
  148. package/tokens/themes/base/dist/diagram.json +81 -41
  149. package/tokens/themes/base/dist/mobile.json +81 -41
  150. package/tokens/themes/brandcopilot/dist/desktop.json +81 -41
  151. package/tokens/themes/brandcopilot/dist/diagram.json +81 -41
  152. package/tokens/themes/brandcopilot/dist/mobile.json +81 -41
  153. package/tokens/themes/dmpatterns/dist/desktop.json +81 -41
  154. package/tokens/themes/dmpatterns/dist/diagram.json +81 -41
  155. package/tokens/themes/dmpatterns/dist/mobile.json +81 -41
  156. package/tokens/themes/pdigest/dist/desktop.json +81 -41
  157. package/tokens/themes/pdigest/dist/diagram.json +81 -41
  158. package/tokens/themes/pdigest/dist/mobile.json +81 -41
  159. package/tokens/themes/redesigntrack/dist/desktop.json +81 -41
  160. package/tokens/themes/redesigntrack/dist/diagram.json +81 -41
  161. package/tokens/themes/redesigntrack/dist/mobile.json +81 -41
@@ -7,6 +7,9 @@ var classnames = require('../helpers/classnames');
7
7
  function isImageAttach(item) {
8
8
  return item.mimeType?.startsWith("image/") ?? false;
9
9
  }
10
+ function isLinkAttach(item) {
11
+ return item.kind === "link";
12
+ }
10
13
  function formatFileSize(sizeBytes) {
11
14
  if (sizeBytes === void 0) {
12
15
  return "Size unknown";
@@ -19,6 +22,13 @@ function formatFileSize(sizeBytes) {
19
22
  }
20
23
  return `${(sizeBytes / 1024 / 1024).toFixed(1)} MB`;
21
24
  }
25
+ function getLinkHostname(url) {
26
+ try {
27
+ return new URL(url).hostname.replace(/^www\./u, "");
28
+ } catch {
29
+ return url;
30
+ }
31
+ }
22
32
  const Attach = ({
23
33
  items,
24
34
  onRemove,
@@ -37,11 +47,18 @@ const Attach = ({
37
47
  className: classes,
38
48
  ...props,
39
49
  children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "attach__list", children: items.map((item) => {
40
- const isImage = isImageAttach(item);
50
+ const isLink = isLinkAttach(item);
51
+ 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);
41
58
  return /* @__PURE__ */ jsxRuntime.jsxs(
42
59
  "li",
43
60
  {
44
- className: "attach__item",
61
+ className: itemClasses,
45
62
  children: [
46
63
  /* @__PURE__ */ jsxRuntime.jsx(
47
64
  "a",
@@ -59,7 +76,7 @@ const Attach = ({
59
76
  }
60
77
  ) : /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "attach__file", children: [
61
78
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "attach__name", children: item.name }),
62
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "attach__size", children: formatFileSize(item.sizeBytes) })
79
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "attach__meta", children: meta })
63
80
  ] })
64
81
  }
65
82
  ),
@@ -68,7 +85,7 @@ const Attach = ({
68
85
  {
69
86
  className: "attach__remove",
70
87
  type: "button",
71
- "aria-label": `${removeLabel} \u0444\u0430\u0439\u043B ${item.name}`,
88
+ "aria-label": `${removeLabel}: ${item.name}`,
72
89
  onClick: () => onRemove(item.id),
73
90
  children: removeLabel
74
91
  }
@@ -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 interface AttachItem {\n id: string;\n name: string;\n url: string;\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 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\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 isImage = isImageAttach(item);\n\n return (\n <li\n key={item.id}\n className=\"attach__item\"\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__size\">\n {formatFileSize(item.sizeBytes)}\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"],"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;"]}
@@ -3,7 +3,7 @@
3
3
  --attachment-color: var(--color-text);
4
4
  --attachment-item-bg: var(--color-control);
5
5
  --attachment-border-color: var(--color-line);
6
- --attachment-size-color: var(--color-text-note);
6
+ --attachment-meta-color: var(--color-text-note);
7
7
 
8
8
  color: var(--attachment-color);
9
9
 
@@ -65,20 +65,31 @@
65
65
  solid
66
66
  var(--attachment-border-color);
67
67
  border-radius: var(--attachment-radius);
68
+
69
+ /* depth */
70
+
71
+ /* motion */
68
72
  }
69
73
 
70
74
  .attach__link {
71
75
  /* color */
72
76
  color: inherit;
73
77
 
78
+ /* typography */
79
+ text-decoration: none;
80
+
74
81
  /* size */
75
82
  min-width: 0;
76
83
 
77
- /* typography */
78
- text-decoration: none;
84
+ /* border */
85
+
86
+ /* depth */
87
+
88
+ /* motion */
79
89
  }
80
90
 
81
91
  .attach__link:hover .attach__name {
92
+ /* typography */
82
93
  text-decoration: underline;
83
94
  }
84
95
 
@@ -91,6 +102,10 @@
91
102
 
92
103
  /* border */
93
104
  border-radius: var(--attachment-radius);
105
+
106
+ /* depth */
107
+
108
+ /* motion */
94
109
  }
95
110
 
96
111
  .attach__file {
@@ -98,23 +113,43 @@
98
113
  display: flex;
99
114
  flex-direction: column;
100
115
  min-width: 0;
116
+
117
+ /* border */
118
+
119
+ /* depth */
120
+
121
+ /* motion */
101
122
  }
102
123
 
103
124
  .attach__name {
104
- /* size */
105
- overflow: hidden;
106
-
107
125
  /* typography */
108
126
  text-overflow: ellipsis;
109
127
  white-space: nowrap;
128
+
129
+ /* size */
130
+ overflow: hidden;
131
+
132
+ /* border */
133
+
134
+ /* depth */
135
+
136
+ /* motion */
110
137
  }
111
138
 
112
- .attach__size {
139
+ .attach__meta {
113
140
  /* color */
114
- color: var(--attachment-size-color);
141
+ color: var(--attachment-meta-color);
115
142
 
116
143
  /* typography */
117
144
  font-size: 0.85em;
145
+
146
+ /* size */
147
+
148
+ /* border */
149
+
150
+ /* depth */
151
+
152
+ /* motion */
118
153
  }
119
154
 
120
155
  .attach__remove {
@@ -132,10 +167,13 @@
132
167
  /* border */
133
168
  border: 0;
134
169
 
170
+ /* depth */
171
+
135
172
  /* motion */
136
173
  cursor: pointer;
137
174
  }
138
175
 
139
176
  .attach__remove:hover {
177
+ /* typography */
140
178
  text-decoration: underline;
141
179
  }
@@ -1,9 +1,11 @@
1
1
  import React from 'react';
2
2
 
3
+ type AttachItemKind = 'file' | 'link';
3
4
  interface AttachItem {
4
5
  id: string;
5
6
  name: string;
6
7
  url: string;
8
+ kind?: AttachItemKind;
7
9
  mimeType?: string;
8
10
  sizeBytes?: number;
9
11
  }
@@ -15,4 +17,4 @@ interface AttachProps extends React.HTMLAttributes<HTMLDivElement> {
15
17
  }
16
18
  declare const Attach: React.FC<AttachProps>;
17
19
 
18
- export { type AttachItem, type AttachProps, Attach as default };
20
+ export { type AttachItem, type AttachItemKind, type AttachProps, Attach as default };
@@ -1,9 +1,11 @@
1
1
  import React from 'react';
2
2
 
3
+ type AttachItemKind = 'file' | 'link';
3
4
  interface AttachItem {
4
5
  id: string;
5
6
  name: string;
6
7
  url: string;
8
+ kind?: AttachItemKind;
7
9
  mimeType?: string;
8
10
  sizeBytes?: number;
9
11
  }
@@ -15,4 +17,4 @@ interface AttachProps extends React.HTMLAttributes<HTMLDivElement> {
15
17
  }
16
18
  declare const Attach: React.FC<AttachProps>;
17
19
 
18
- export { type AttachItem, type AttachProps, Attach as default };
20
+ export { type AttachItem, type AttachItemKind, type AttachProps, Attach as default };
@@ -5,6 +5,9 @@ import { classnames } from '../helpers/classnames';
5
5
  function isImageAttach(item) {
6
6
  return item.mimeType?.startsWith("image/") ?? false;
7
7
  }
8
+ function isLinkAttach(item) {
9
+ return item.kind === "link";
10
+ }
8
11
  function formatFileSize(sizeBytes) {
9
12
  if (sizeBytes === void 0) {
10
13
  return "Size unknown";
@@ -17,6 +20,13 @@ function formatFileSize(sizeBytes) {
17
20
  }
18
21
  return `${(sizeBytes / 1024 / 1024).toFixed(1)} MB`;
19
22
  }
23
+ function getLinkHostname(url) {
24
+ try {
25
+ return new URL(url).hostname.replace(/^www\./u, "");
26
+ } catch {
27
+ return url;
28
+ }
29
+ }
20
30
  const Attach = ({
21
31
  items,
22
32
  onRemove,
@@ -35,11 +45,18 @@ const Attach = ({
35
45
  className: classes,
36
46
  ...props,
37
47
  children: /* @__PURE__ */ jsx("ul", { className: "attach__list", children: items.map((item) => {
38
- const isImage = isImageAttach(item);
48
+ const isLink = isLinkAttach(item);
49
+ 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);
39
56
  return /* @__PURE__ */ jsxs(
40
57
  "li",
41
58
  {
42
- className: "attach__item",
59
+ className: itemClasses,
43
60
  children: [
44
61
  /* @__PURE__ */ jsx(
45
62
  "a",
@@ -57,7 +74,7 @@ const Attach = ({
57
74
  }
58
75
  ) : /* @__PURE__ */ jsxs("span", { className: "attach__file", children: [
59
76
  /* @__PURE__ */ jsx("span", { className: "attach__name", children: item.name }),
60
- /* @__PURE__ */ jsx("span", { className: "attach__size", children: formatFileSize(item.sizeBytes) })
77
+ /* @__PURE__ */ jsx("span", { className: "attach__meta", children: meta })
61
78
  ] })
62
79
  }
63
80
  ),
@@ -66,7 +83,7 @@ const Attach = ({
66
83
  {
67
84
  className: "attach__remove",
68
85
  type: "button",
69
- "aria-label": `${removeLabel} \u0444\u0430\u0439\u043B ${item.name}`,
86
+ "aria-label": `${removeLabel}: ${item.name}`,
70
87
  onClick: () => onRemove(item.id),
71
88
  children: removeLabel
72
89
  }
@@ -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 interface AttachItem {\n id: string;\n name: string;\n url: string;\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 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\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 isImage = isImageAttach(item);\n\n return (\n <li\n key={item.id}\n className=\"attach__item\"\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__size\">\n {formatFileSize(item.sizeBytes)}\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';\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;"]}
@@ -24,6 +24,11 @@
24
24
  gap: 0;
25
25
  }
26
26
 
27
+ :where(a, button) .logo {
28
+ /* motion */
29
+ cursor: pointer;
30
+ }
31
+
27
32
  .logo__symbol {
28
33
  /* size */
29
34
  display: block;
@@ -1,17 +1,17 @@
1
1
  .tag {
2
2
  /* color */
3
- --tag-bg: var(--color-colorsemigood);
4
- --tag-text: var(--color-colortextcontrol);
3
+ --tag-bg: var(--color-semi-good);
4
+ --tag-text: var(--color-text-control);
5
5
 
6
6
  background: var(--tag-bg);
7
7
  color: var(--tag-text);
8
8
 
9
9
  /* typography */
10
- --tag-font-family: var(--typography-fontbodyfamily);
11
- --tag-font-weight: var(--typography-fontnoteweight);
12
- --tag-font-size: var(--typography-fontnote);
13
- --tag-line-height: var(--typography-fontnoteline);
14
- --tag-letter-spacing: var(--typography-fontnoteletterspacing);
10
+ --tag-font-family: var(--font-note-family);
11
+ --tag-font-weight: var(--font-note-weight);
12
+ --tag-font-size: var(--font-note-size);
13
+ --tag-line-height: var(--font-note-line-height);
14
+ --tag-letter-spacing: var(--font-note-letter-spacing);
15
15
 
16
16
  font-family: var(--tag-font-family);
17
17
  font-size: var(--tag-font-size);
@@ -22,8 +22,8 @@
22
22
  /* size */
23
23
  --tag-gap: 0;
24
24
  --tag-height: auto;
25
- --tag-padding-x: var(--size-paddingtaghorz);
26
- --tag-padding-y: var(--size-paddingtagvert);
25
+ --tag-padding-x: var(--padding-tag-horz);
26
+ --tag-padding-y: var(--padding-tag-vert);
27
27
 
28
28
  display: inline-flex;
29
29
  align-items: center;
@@ -33,11 +33,11 @@
33
33
 
34
34
  /* border */
35
35
  --tag-border-width: 0;
36
- --tag-border-radius: var(--border-radiuscontrol);
36
+ --tag-border-radius: var(--radius-control);
37
37
  --tag-border-color: transparent;
38
38
 
39
- border: var(--tag-border-width) solid var(--tag-border-color);
40
- border-radius: var(--tag-border-radius);
39
+ border: none;
40
+ border-radius: var(--radius-control);
41
41
  outline: none;
42
42
 
43
43
  /* depth */
@@ -79,9 +79,9 @@
79
79
  }
80
80
 
81
81
  .tag--context-error {
82
- --tag-bg: var(--color-colorbad);
82
+ --tag-bg: var(--color-bad);
83
83
  }
84
84
 
85
85
  .tag--context-warning {
86
- --tag-bg: var(--color-colormed);
86
+ --tag-bg: var(--color-med);
87
87
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jvetrau-ds",
3
- "version": "0.1.30",
3
+ "version": "0.1.32",
4
4
  "description": "Multi-brand React design system with semantic tokens",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
package/styles.css CHANGED
@@ -32,7 +32,7 @@
32
32
  --attachment-color: var(--color-text);
33
33
  --attachment-item-bg: var(--color-control);
34
34
  --attachment-border-color: var(--color-line);
35
- --attachment-size-color: var(--color-text-note);
35
+ --attachment-meta-color: var(--color-text-note);
36
36
 
37
37
  color: var(--attachment-color);
38
38
 
@@ -94,20 +94,31 @@
94
94
  solid
95
95
  var(--attachment-border-color);
96
96
  border-radius: var(--attachment-radius);
97
+
98
+ /* depth */
99
+
100
+ /* motion */
97
101
  }
98
102
 
99
103
  .attach__link {
100
104
  /* color */
101
105
  color: inherit;
102
106
 
107
+ /* typography */
108
+ text-decoration: none;
109
+
103
110
  /* size */
104
111
  min-width: 0;
105
112
 
106
- /* typography */
107
- text-decoration: none;
113
+ /* border */
114
+
115
+ /* depth */
116
+
117
+ /* motion */
108
118
  }
109
119
 
110
120
  .attach__link:hover .attach__name {
121
+ /* typography */
111
122
  text-decoration: underline;
112
123
  }
113
124
 
@@ -120,6 +131,10 @@
120
131
 
121
132
  /* border */
122
133
  border-radius: var(--attachment-radius);
134
+
135
+ /* depth */
136
+
137
+ /* motion */
123
138
  }
124
139
 
125
140
  .attach__file {
@@ -127,23 +142,43 @@
127
142
  display: flex;
128
143
  flex-direction: column;
129
144
  min-width: 0;
145
+
146
+ /* border */
147
+
148
+ /* depth */
149
+
150
+ /* motion */
130
151
  }
131
152
 
132
153
  .attach__name {
133
- /* size */
134
- overflow: hidden;
135
-
136
154
  /* typography */
137
155
  text-overflow: ellipsis;
138
156
  white-space: nowrap;
157
+
158
+ /* size */
159
+ overflow: hidden;
160
+
161
+ /* border */
162
+
163
+ /* depth */
164
+
165
+ /* motion */
139
166
  }
140
167
 
141
- .attach__size {
168
+ .attach__meta {
142
169
  /* color */
143
- color: var(--attachment-size-color);
170
+ color: var(--attachment-meta-color);
144
171
 
145
172
  /* typography */
146
173
  font-size: 0.85em;
174
+
175
+ /* size */
176
+
177
+ /* border */
178
+
179
+ /* depth */
180
+
181
+ /* motion */
147
182
  }
148
183
 
149
184
  .attach__remove {
@@ -161,11 +196,14 @@
161
196
  /* border */
162
197
  border: 0;
163
198
 
199
+ /* depth */
200
+
164
201
  /* motion */
165
202
  cursor: pointer;
166
203
  }
167
204
 
168
205
  .attach__remove:hover {
206
+ /* typography */
169
207
  text-decoration: underline;
170
208
  }
171
209
 
@@ -1179,6 +1217,11 @@
1179
1217
  gap: 0;
1180
1218
  }
1181
1219
 
1220
+ :where(a, button) .logo {
1221
+ /* motion */
1222
+ cursor: pointer;
1223
+ }
1224
+
1182
1225
  .logo__symbol {
1183
1226
  /* size */
1184
1227
  display: block;
@@ -2114,18 +2157,18 @@
2114
2157
  /* src/components/tag/tag.css */
2115
2158
  .tag {
2116
2159
  /* color */
2117
- --tag-bg: var(--color-colorsemigood);
2118
- --tag-text: var(--color-colortextcontrol);
2160
+ --tag-bg: var(--color-semi-good);
2161
+ --tag-text: var(--color-text-control);
2119
2162
 
2120
2163
  background: var(--tag-bg);
2121
2164
  color: var(--tag-text);
2122
2165
 
2123
2166
  /* typography */
2124
- --tag-font-family: var(--typography-fontbodyfamily);
2125
- --tag-font-weight: var(--typography-fontnoteweight);
2126
- --tag-font-size: var(--typography-fontnote);
2127
- --tag-line-height: var(--typography-fontnoteline);
2128
- --tag-letter-spacing: var(--typography-fontnoteletterspacing);
2167
+ --tag-font-family: var(--font-note-family);
2168
+ --tag-font-weight: var(--font-note-weight);
2169
+ --tag-font-size: var(--font-note-size);
2170
+ --tag-line-height: var(--font-note-line-height);
2171
+ --tag-letter-spacing: var(--font-note-letter-spacing);
2129
2172
 
2130
2173
  font-family: var(--tag-font-family);
2131
2174
  font-size: var(--tag-font-size);
@@ -2136,8 +2179,8 @@
2136
2179
  /* size */
2137
2180
  --tag-gap: 0;
2138
2181
  --tag-height: auto;
2139
- --tag-padding-x: var(--size-paddingtaghorz);
2140
- --tag-padding-y: var(--size-paddingtagvert);
2182
+ --tag-padding-x: var(--padding-tag-horz);
2183
+ --tag-padding-y: var(--padding-tag-vert);
2141
2184
 
2142
2185
  display: inline-flex;
2143
2186
  align-items: center;
@@ -2147,11 +2190,11 @@
2147
2190
 
2148
2191
  /* border */
2149
2192
  --tag-border-width: 0;
2150
- --tag-border-radius: var(--border-radiuscontrol);
2193
+ --tag-border-radius: var(--radius-control);
2151
2194
  --tag-border-color: transparent;
2152
2195
 
2153
- border: var(--tag-border-width) solid var(--tag-border-color);
2154
- border-radius: var(--tag-border-radius);
2196
+ border: none;
2197
+ border-radius: var(--radius-control);
2155
2198
  outline: none;
2156
2199
 
2157
2200
  /* depth */
@@ -2193,11 +2236,11 @@
2193
2236
  }
2194
2237
 
2195
2238
  .tag--context-error {
2196
- --tag-bg: var(--color-colorbad);
2239
+ --tag-bg: var(--color-bad);
2197
2240
  }
2198
2241
 
2199
2242
  .tag--context-warning {
2200
- --tag-bg: var(--color-colormed);
2243
+ --tag-bg: var(--color-med);
2201
2244
  }
2202
2245
 
2203
2246
  /* src/components/textarea/textarea.css */
@@ -1,4 +1,6 @@
1
1
  :root {
2
+ --color-alt: #FFFFFF;
3
+ --color-bad: var(--color-primary-2);
2
4
  --color-bg: #191A1A;
3
5
  --color-bg-container: var(--color-primary-1);
4
6
  --color-bg-contrast: #FFFFFF;
@@ -8,23 +10,26 @@
8
10
  --color-bg-true-black: #000000;
9
11
  --color-contrast: #FFFFFF;
10
12
  --color-control: #FFFFFF;
13
+ --color-good: var(--color-primary-1);
11
14
  --color-line: #FFFFFF;
12
- --color-line-bad: var(--color-primary-2);
13
15
  --color-line-contrast: #000000;
14
- --color-line-good: var(--color-primary-1);
15
16
  --color-line-grid: #3E3F40;
16
- --color-line-med: #FF7300;
17
- --color-line-semi-bad: #FF4000;
18
- --color-line-semi-good: #FFBF00;
19
17
  --color-link: var(--color-primary-2);
20
18
  --color-link-visited: var(--color-primary-2);
19
+ --color-med: #FF7300;
21
20
  --color-primary-1: #F9EC0E;
22
21
  --color-primary-2: #FA4691;
23
22
  --color-secondary: #FFFFFF;
23
+ --color-semi-bad: #FF4000;
24
+ --color-semi-good: #FFBF00;
24
25
  --color-text: #FFFFFF;
26
+ --color-text-alt: var(--color-alt);
27
+ --color-text-bad: var(--color-bad);
25
28
  --color-text-container: #000000;
26
29
  --color-text-contrast: #000000;
27
30
  --color-text-control: #000000;
31
+ --color-text-good: var(--color-good);
32
+ --color-text-med: var(--color-med);
28
33
  --color-text-note: #BABDBF;
29
34
  --color-text-primary-1: #000000;
30
35
  --color-text-primary-2: #FFFFFF;
@@ -109,8 +114,6 @@
109
114
  --margin-menu: 20px;
110
115
  --margin-popup: 0px;
111
116
  --margin-tab: var(--margin-menu);
112
- --margin-tag-horz: 8px;
113
- --margin-tag-vert: 4px;
114
117
  --margin-tooltip: 0px;
115
118
  --motion-duration1: 0px;
116
119
  --padding-arrow: 0px;
@@ -129,6 +132,8 @@
129
132
  --padding-table-horz: 0px;
130
133
  --padding-table-vert: 0px;
131
134
  --padding-tag: 4px;
135
+ --padding-tag-horz: 8px;
136
+ --padding-tag-vert: 4px;
132
137
  --radius-base: 84px;
133
138
  --radius-circle: 300px;
134
139
  --radius-container: 30px;