@icen.ai/ui 0.2.1 → 0.3.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 (103) hide show
  1. package/README.md +29 -16
  2. package/dist/base.css +389 -48
  3. package/dist/behaviors/accordion.mjs +20 -0
  4. package/dist/behaviors/carousel.mjs +30 -1
  5. package/dist/behaviors/charts.mjs +168 -0
  6. package/dist/behaviors/copy.mjs +4 -3
  7. package/dist/behaviors/datatable.mjs +748 -0
  8. package/dist/behaviors/input.mjs +20 -1
  9. package/dist/behaviors/modal.mjs +14 -0
  10. package/dist/behaviors/nav.mjs +31 -4
  11. package/dist/behaviors/sidebar.mjs +12 -0
  12. package/dist/behaviors/slider.mjs +35 -3
  13. package/dist/behaviors/tabs.mjs +100 -9
  14. package/dist/behaviors/tag-input.mjs +11 -0
  15. package/dist/behaviors/theme.mjs +26 -0
  16. package/dist/behaviors/toast.mjs +83 -15
  17. package/dist/behaviors/tree.mjs +57 -1
  18. package/dist/behaviors/upload.mjs +2 -3
  19. package/dist/cli.mjs +74 -0
  20. package/dist/components/accordion.mjs +3 -0
  21. package/dist/components/alert.mjs +2 -0
  22. package/dist/components/avatar.mjs +2 -0
  23. package/dist/components/breadcrumb.css +91 -18
  24. package/dist/components/breadcrumb.mjs +2 -0
  25. package/dist/components/btn.css +174 -14
  26. package/dist/components/btn.mjs +2 -0
  27. package/dist/components/card.css +118 -18
  28. package/dist/components/card.mjs +2 -0
  29. package/dist/components/carousel.mjs +3 -0
  30. package/dist/components/charts.css +225 -33
  31. package/dist/components/charts.mjs +3 -0
  32. package/dist/components/content.css +256 -74
  33. package/dist/components/context-menu.mjs +3 -0
  34. package/dist/components/datatable.css +343 -0
  35. package/dist/components/datatable.mjs +4 -0
  36. package/dist/components/desc.mjs +2 -0
  37. package/dist/components/dropdown.mjs +3 -0
  38. package/dist/components/empty.css +50 -10
  39. package/dist/components/empty.mjs +2 -0
  40. package/dist/components/feedback.css +158 -47
  41. package/dist/components/form.css +139 -22
  42. package/dist/components/input.css +165 -45
  43. package/dist/components/input.mjs +3 -0
  44. package/dist/components/kbd.mjs +2 -0
  45. package/dist/components/layout.mjs +2 -0
  46. package/dist/components/list.mjs +2 -0
  47. package/dist/components/media-card.mjs +2 -0
  48. package/dist/components/media.css +187 -40
  49. package/dist/components/menu.css +159 -32
  50. package/dist/components/modal.css +140 -34
  51. package/dist/components/modal.mjs +3 -0
  52. package/dist/components/nav.css +134 -32
  53. package/dist/components/nav.mjs +3 -0
  54. package/dist/components/pagination.css +105 -19
  55. package/dist/components/pagination.mjs +2 -0
  56. package/dist/components/panel.css +61 -6
  57. package/dist/components/panel.mjs +2 -0
  58. package/dist/components/pill.css +74 -14
  59. package/dist/components/pill.mjs +2 -0
  60. package/dist/components/popover.css +109 -7
  61. package/dist/components/popover.mjs +3 -0
  62. package/dist/components/progress.mjs +2 -0
  63. package/dist/components/rating.mjs +2 -0
  64. package/dist/components/result.mjs +2 -0
  65. package/dist/components/segmented.css +199 -50
  66. package/dist/components/segmented.mjs +2 -0
  67. package/dist/components/select.css +140 -39
  68. package/dist/components/select.mjs +3 -0
  69. package/dist/components/sidebar.css +162 -34
  70. package/dist/components/sidebar.mjs +3 -0
  71. package/dist/components/skeleton.mjs +2 -0
  72. package/dist/components/slider.css +169 -31
  73. package/dist/components/slider.mjs +3 -0
  74. package/dist/components/spinner.mjs +2 -0
  75. package/dist/components/stat.css +103 -8
  76. package/dist/components/stat.mjs +2 -0
  77. package/dist/components/steps.css +105 -31
  78. package/dist/components/steps.mjs +2 -0
  79. package/dist/components/switch.css +171 -54
  80. package/dist/components/switch.mjs +2 -0
  81. package/dist/components/table.css +114 -12
  82. package/dist/components/table.mjs +2 -0
  83. package/dist/components/tabs.css +104 -17
  84. package/dist/components/tabs.mjs +3 -0
  85. package/dist/components/tag-input.css +119 -23
  86. package/dist/components/tag-input.mjs +3 -0
  87. package/dist/components/timeline.mjs +2 -0
  88. package/dist/components/toast.css +85 -12
  89. package/dist/components/toast.mjs +3 -0
  90. package/dist/components/tooltip.css +86 -26
  91. package/dist/components/tooltip.mjs +2 -0
  92. package/dist/components/tree.mjs +3 -0
  93. package/dist/components/upload.css +144 -17
  94. package/dist/components/upload.mjs +3 -0
  95. package/dist/index.mjs +623 -42
  96. package/dist/registry.json +197 -2
  97. package/dist/retro-effects.css +264 -0
  98. package/dist/tokens/colors.css +18 -90
  99. package/dist/tokens/retro-effects.css +264 -0
  100. package/dist/tokens/style-profiles.css +47 -47
  101. package/dist/tokens.css +65 -137
  102. package/dist/ui.css +4861 -1019
  103. package/package.json +9 -1
@@ -2,42 +2,169 @@
2
2
  * @icen.ai/ui — Component: upload(拖放上传区)
3
3
  * 规格源自 opengal primitives/advanced-input.tsx 的 Upload;与 behaviors/upload.ts 配套。
4
4
  *
5
- * 契约:
6
- * <div class="upload control lift focus-ring" role="button" tabindex="0">
7
- * <input type="file" multiple />
8
- * <div class="upload-icon"><svg …></svg></div>
9
- * <p class="upload-title">…</p>
10
- * <p class="upload-desc">…</p>
11
- * <p class="upload-error" hidden>…</p>
5
+ * 完整契约:
6
+ * <div class="upload control lift focus-ring [--compact] [.is-drag] [.is-disabled] [.is-loading]"
7
+ * role="button" tabindex="0" aria-label="拖放或点击上传文件">
8
+ * <input type="file" multiple accept="…" />
9
+ * <div class="upload-icon">…svg…</div>
10
+ * <p class="upload-title">拖放文件到此处,或<span class="upload-link">点击选择</span></p>
11
+ * <p class="upload-desc">支持 PDF / PNG / JPG,单个 ≤ 5 MB</p>
12
+ * <p class="upload-error" hidden role="alert">文件超过 5 MB</p>
12
13
  * </div>
13
- * 拖入时 behavior 加 .is-drag。
14
+ *
15
+ * behavior 维护:
16
+ * - dragenter/dragover 加 .is-drag,dragleave/drop 移除
17
+ * - 校验 accept/size,错误写 .upload-error[hidden=false]
18
+ * - 文件列表(可选)渲染到 .upload + <ul class="upload-list">,behavior 提供
14
19
  */
15
20
 
16
21
  .upload {
17
- display: flex; flex-direction: column; align-items: center; justify-content: center;
18
- text-align: center; padding: 32px 16px;
22
+ display: flex;
23
+ flex-direction: column;
24
+ align-items: center;
25
+ justify-content: center;
26
+ text-align: center;
27
+ padding: var(--density-space-lg) var(--density-space-md);
19
28
  border: 2px dashed var(--token-outline-soft);
20
29
  border-radius: var(--radius-lg);
30
+ background: var(--token-bg-soft);
21
31
  cursor: pointer;
32
+ transition:
33
+ border-color var(--icen-tx-fast),
34
+ background-color var(--icen-tx-fast),
35
+ transform var(--icen-tx-fast);
22
36
  }
23
- .upload:hover {
37
+ .upload:hover:not(.is-disabled) {
24
38
  border-color: color-mix(in srgb, var(--token-accent) 60%, transparent);
25
39
  background: var(--token-control-hover);
26
40
  }
41
+ .upload:focus-visible {
42
+ outline: none;
43
+ border-color: var(--icen-control-focus-border);
44
+ box-shadow: var(--icen-control-focus-shadow);
45
+ }
27
46
  .upload.is-drag {
28
47
  border-color: var(--token-accent);
48
+ border-style: solid;
29
49
  background: var(--token-accent-subtle);
50
+ transform: scale(1.005);
51
+ }
52
+ .upload.is-disabled,
53
+ .upload[aria-disabled='true'],
54
+ .upload[data-disabled] {
55
+ opacity: var(--icen-disabled-opacity);
56
+ cursor: not-allowed;
57
+ pointer-events: none;
30
58
  }
59
+ .upload.is-loading,
60
+ .upload[aria-busy='true'] {
61
+ cursor: progress;
62
+ pointer-events: none;
63
+ }
64
+
65
+ .upload--compact { padding: var(--density-space-sm) var(--density-space-md); }
66
+ .upload--compact .upload-icon { width: 28px; height: 28px; margin-bottom: 4px; }
31
67
 
32
68
  .upload input[type='file'] { display: none; }
33
69
 
34
70
  .upload-icon {
35
- display: flex; align-items: center; justify-content: center;
36
- width: 40px; height: 40px; margin-bottom: 8px;
71
+ display: flex;
72
+ align-items: center;
73
+ justify-content: center;
74
+ width: 40px;
75
+ height: 40px;
76
+ margin-bottom: var(--density-space-sm);
37
77
  border-radius: var(--radius-lg);
38
- background: var(--token-accent-subtle); color: var(--token-accent);
78
+ background: var(--token-accent-subtle);
79
+ color: var(--token-accent);
80
+ transition: transform var(--icen-tx-fast);
81
+ }
82
+ .upload:hover:not(.is-disabled) .upload-icon,
83
+ .upload.is-drag .upload-icon {
84
+ transform: scale(1.08);
85
+ }
86
+ .upload-icon svg { width: 20px; height: 20px; }
87
+
88
+ .upload-title {
89
+ margin: 0;
90
+ font-size: var(--density-font-size-md);
91
+ font-weight: 500;
92
+ color: var(--token-text);
93
+ }
94
+ .upload-link {
95
+ color: var(--token-accent);
96
+ text-decoration: underline;
97
+ text-underline-offset: 3px;
98
+ }
99
+ .upload-desc {
100
+ margin: 2px 0 0;
101
+ font-size: var(--density-font-size-xs);
102
+ color: var(--token-text-faint);
103
+ }
104
+ .upload-error {
105
+ margin: var(--density-space-xs) 0 0;
106
+ padding: 6px 10px;
107
+ font-size: var(--density-font-size-xs);
108
+ color: var(--token-error);
109
+ background: var(--token-error-muted);
110
+ border-radius: var(--radius-sm);
39
111
  }
40
112
 
41
- .upload-title { margin: 0; font-size: 13px; font-weight: 500; color: var(--token-text); }
42
- .upload-desc { margin: 2px 0 0; font-size: 11px; color: var(--token-text-faint); }
43
- .upload-error { margin: 4px 0 0; font-size: 11px; color: var(--token-error); }
113
+ /* 文件列表(behavior 可选渲染) */
114
+ .upload-list {
115
+ list-style: none;
116
+ padding: 0;
117
+ margin: var(--density-space-sm) 0 0;
118
+ width: 100%;
119
+ display: flex;
120
+ flex-direction: column;
121
+ gap: var(--density-space-xs);
122
+ }
123
+ .upload-list-item {
124
+ display: flex;
125
+ align-items: center;
126
+ gap: var(--density-space-sm);
127
+ padding: var(--density-space-xs) var(--density-space-sm);
128
+ background: var(--token-surface);
129
+ border: 1px solid var(--token-outline-soft);
130
+ border-radius: var(--radius-sm);
131
+ font-size: var(--density-font-size-sm);
132
+ animation: upload-item-in var(--icen-tx-fast);
133
+ }
134
+ .upload-list-item-name {
135
+ flex: 1;
136
+ overflow: hidden;
137
+ text-overflow: ellipsis;
138
+ white-space: nowrap;
139
+ }
140
+ .upload-list-item-size {
141
+ color: var(--token-text-faint);
142
+ font-variant-numeric: tabular-nums;
143
+ font-size: var(--density-font-size-xs);
144
+ }
145
+ .upload-list-item-x {
146
+ border: none;
147
+ background: transparent;
148
+ cursor: pointer;
149
+ color: var(--token-text-faint);
150
+ padding: 2px;
151
+ border-radius: var(--radius-full);
152
+ display: inline-flex;
153
+ transition: color var(--icen-tx-fast), background-color var(--icen-tx-fast);
154
+ }
155
+ .upload-list-item-x:hover {
156
+ color: var(--token-text);
157
+ background: var(--token-fill-2);
158
+ }
159
+ .upload-list-item-x:focus-visible {
160
+ outline: none;
161
+ box-shadow: var(--icen-ring);
162
+ }
163
+
164
+ @keyframes upload-item-in {
165
+ from { opacity: 0; transform: translateY(-4px); }
166
+ to { opacity: 1; transform: translateY(0); }
167
+ }
168
+ @media (prefers-reduced-motion: reduce) {
169
+ .upload-list-item, .upload-icon { animation: none; transition: none; }
170
+ }
@@ -0,0 +1,3 @@
1
+ // @icen.ai/ui — kit: upload(CSS + behavior 一行入口;构建产物,勿手改)
2
+ import './upload.css';
3
+ export * from '../behaviors/upload.mjs';