@icen.ai/ui 0.3.0 → 0.4.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.
package/dist/ui.css CHANGED
@@ -2767,86 +2767,33 @@ html {
2767
2767
  }
2768
2768
 
2769
2769
 
2770
- /* ── components/charts.css ── */
2770
+ /* ── components/chart-area.css ── */
2771
2771
  /*
2772
- * @icen.ai/ui — Component: charts(轻量图表,与 behaviors/charts 配套)
2773
- *
2774
- * 包含:.chart 容器 / .chart-empty / .chart-legend(图例行)/ .chart-labels(轴标签行)/
2775
- * vbar(垂直柱状)/ hbar(水平条形)/ stack(堆叠条)/ donut(环形)/ line(折线)/
2776
- * heatmap(贡献图热力格)/ sparkline(迷你趋势)/ gauge(进度环)
2772
+ * @icen.ai/ui — Component: chart-area(面积图专属样式)
2773
+ * 依赖:charts.css(基座)
2777
2774
  *
2778
- * 完整契约:DOM 全部由 behaviors/charts.ts 以 createElement(NS) + textContent 构建;
2779
- * 单色调通过容器或条上的 --chart-tone 自定义属性注入(默认 var(--token-accent))。
2780
- * 规格源自 opengal src/presentation/ui/data/charts.tsx。
2775
+ * DOM 由 behaviors/charts.ts 的 renderArea 构建:
2776
+ * .chart-area > svg[viewBox="0 0 360 150"]
2777
+ * 与折线同族,但以面积填充为视觉主体(渐变更浓、描边更细)。
2781
2778
  */
2782
2779
 
2783
- .chart {
2780
+ .chart-area > svg {
2781
+ display: block;
2784
2782
  width: 100%;
2785
- display: flex;
2786
- flex-direction: column;
2787
- gap: var(--density-space-sm);
2788
- }
2789
- .chart-empty {
2790
2783
  height: 150px;
2791
- display: flex;
2792
- align-items: center;
2793
- justify-content: center;
2794
- font-size: var(--density-font-size-xs);
2795
- color: var(--token-text-faint);
2784
+ overflow: visible;
2796
2785
  }
2797
2786
 
2798
- /* ── 图例 / 轴标签(donut / stack / vbar / line 共用) ── */
2799
- .chart-legend {
2800
- display: flex;
2801
- flex-direction: column;
2802
- gap: 6px;
2803
- min-width: 0;
2804
- flex: 1;
2805
- }
2806
- .chart-legend-item {
2807
- display: flex;
2808
- align-items: center;
2809
- gap: var(--density-space-xs);
2810
- font-size: var(--density-font-size-xs);
2811
- min-width: 0;
2812
- }
2813
- .chart-legend-dot {
2814
- width: 8px;
2815
- height: 8px;
2816
- flex-shrink: 0;
2817
- border-radius: var(--radius-full);
2818
- background: var(--chart-tone, var(--token-accent));
2819
- }
2820
- .chart-legend-label {
2821
- flex: 1;
2822
- min-width: 0;
2823
- overflow: hidden;
2824
- text-overflow: ellipsis;
2825
- white-space: nowrap;
2826
- color: var(--token-text-muted);
2827
- }
2828
- .chart-legend-value {
2829
- flex-shrink: 0;
2830
- font-variant-numeric: tabular-nums;
2831
- color: var(--token-text-faint);
2832
- }
2833
2787
 
2834
- .chart-labels {
2835
- display: flex;
2836
- gap: var(--density-space-xs);
2837
- margin-top: var(--density-space-xs);
2838
- }
2839
- .chart-labels > span {
2840
- flex: 1;
2841
- min-width: 0;
2842
- text-align: center;
2843
- font-size: 9px;
2844
- color: var(--token-text-faint);
2845
- overflow: hidden;
2846
- text-overflow: ellipsis;
2847
- white-space: nowrap;
2848
- font-variant-numeric: tabular-nums;
2849
- }
2788
+ /* ── components/chart-bar.css ── */
2789
+ /*
2790
+ * @icen.ai/ui — Component: chart-bar(柱状/条形图专属样式)
2791
+ * 依赖:charts.css(基座 .chart / .chart-labels / --chart-tone)
2792
+ *
2793
+ * DOM 由 behaviors/charts.ts 的 renderVBar / renderHBar 构建:
2794
+ * .chart-vbar > .chart-vbar-track > .chart-vbar-bar
2795
+ * .chart-hbar > .chart-hbar-row > .chart-hbar-label + .chart-hbar-track > .chart-hbar-bar + .chart-hbar-value
2796
+ */
2850
2797
 
2851
2798
  /* ── vbar · 垂直柱状 ── */
2852
2799
  .chart-vbar {
@@ -2915,53 +2862,63 @@ html {
2915
2862
  color: var(--token-text-faint);
2916
2863
  }
2917
2864
 
2918
- /* ── stack · 堆叠条 ── */
2919
- .chart-stack {
2920
- height: 16px;
2921
- display: flex;
2922
- overflow: hidden;
2923
- border-radius: var(--radius-full);
2924
- background: var(--token-fill-2);
2925
- margin-bottom: var(--density-space-sm);
2926
- }
2927
- .chart-stack-seg {
2928
- height: 100%;
2929
- min-width: 3px;
2930
- background: var(--chart-tone, var(--token-accent));
2931
- transition: width var(--icen-tx-slow);
2932
- }
2933
- .chart-stack-seg:hover {
2934
- filter: brightness(1.08);
2865
+ @media (prefers-reduced-motion: reduce) {
2866
+ .chart-vbar-bar, .chart-hbar-bar { transition: none; }
2935
2867
  }
2936
2868
 
2937
- /* ── donut · 环形 ── */
2938
- .chart-donut {
2939
- display: flex;
2940
- align-items: center;
2941
- gap: var(--density-space-md);
2942
- min-height: 150px;
2869
+
2870
+ /* ── components/chart-gauge.css ── */
2871
+ /*
2872
+ * @icen.ai/ui — Component: chart-gauge(进度环 / 仪表盘专属样式)
2873
+ * 依赖:charts.css(基座 --chart-tone)
2874
+ *
2875
+ * DOM 由 behaviors/charts.ts 的 renderGauge 构建:
2876
+ * .chart-gauge > svg[viewBox="0 0 120 120"](-90° 起笔,环形单值)
2877
+ * > .chart-gauge-center > .chart-gauge-value + .chart-gauge-label
2878
+ */
2879
+
2880
+ .chart-gauge {
2881
+ position: relative;
2882
+ width: 132px;
2883
+ flex-shrink: 0;
2943
2884
  }
2944
- .chart-donut > svg {
2885
+ .chart-gauge > svg {
2886
+ display: block;
2945
2887
  width: 132px;
2946
2888
  height: 132px;
2947
- flex-shrink: 0;
2948
2889
  }
2949
- .chart-donut-center {
2890
+ .chart-gauge-center {
2891
+ position: absolute;
2892
+ inset: 0;
2893
+ display: flex;
2894
+ flex-direction: column;
2895
+ align-items: center;
2896
+ justify-content: center;
2897
+ gap: 1px;
2898
+ }
2899
+ .chart-gauge-value {
2900
+ font-size: 20px;
2901
+ font-weight: 700;
2950
2902
  font-variant-numeric: tabular-nums;
2951
- text-anchor: middle;
2952
- fill: var(--token-text);
2953
- font-weight: 600;
2903
+ color: var(--token-text);
2954
2904
  }
2955
-
2956
- /* ── line · 折线 ── */
2957
- .chart-line > svg {
2958
- display: block;
2959
- width: 100%;
2960
- height: 150px;
2961
- overflow: visible;
2905
+ .chart-gauge-label {
2906
+ font-size: var(--density-font-size-xs);
2907
+ color: var(--token-text-faint);
2962
2908
  }
2963
2909
 
2964
- /* ── heatmap · 贡献图(GitHub 式 7 行 × N 周) ── */
2910
+
2911
+ /* ── components/chart-heatmap.css ── */
2912
+ /*
2913
+ * @icen.ai/ui — Component: chart-heatmap(热力图 / 贡献图专属样式)
2914
+ * 依赖:charts.css(基座 --chart-tone)
2915
+ *
2916
+ * DOM 由 behaviors/charts.ts 的 renderHeatmap 构建:
2917
+ * .chart-heatmap > .chart-heatmap-grid > .chart-heatmap-cell[data-level=0-4][.is-blank]
2918
+ * > .chart-heatmap-legend
2919
+ * 7 行(周一→周日)× N 周列,5 档色阶(data-level 0-4)。
2920
+ */
2921
+
2965
2922
  .chart-heatmap {
2966
2923
  display: flex;
2967
2924
  flex-direction: column;
@@ -3005,46 +2962,208 @@ html {
3005
2962
  .chart-heatmap-legend > span:first-child { margin-right: 2px; }
3006
2963
  .chart-heatmap-legend > span:last-child { margin-left: 2px; }
3007
2964
 
3008
- /* ── sparkline · 迷你趋势 ── */
3009
- .chart-sparkline > svg {
2965
+
2966
+ /* ── components/chart-line.css ── */
2967
+ /*
2968
+ * @icen.ai/ui — Component: chart-line(折线图专属样式)
2969
+ * 依赖:charts.css(基座)
2970
+ *
2971
+ * DOM 由 behaviors/charts.ts 的 renderLine 构建:
2972
+ * .chart-line > svg[viewBox="0 0 360 150"]
2973
+ * 含面积渐变 + 网格线 + 数据点 + 底部 .chart-labels。
2974
+ */
2975
+
2976
+ .chart-line > svg {
3010
2977
  display: block;
3011
- width: 96px;
3012
- height: 28px;
2978
+ width: 100%;
2979
+ height: 150px;
3013
2980
  overflow: visible;
3014
2981
  }
3015
2982
 
3016
- /* ── gauge · 进度环 ── */
3017
- .chart-gauge {
3018
- position: relative;
2983
+
2984
+ /* ── components/chart-pie.css ── */
2985
+ /*
2986
+ * @icen.ai/ui — Component: chart-pie(饼/环形图专属样式)
2987
+ * 依赖:charts.css(基座 .chart-legend)
2988
+ *
2989
+ * DOM 由 behaviors/charts.ts 的 renderDonut 构建:
2990
+ * .chart-donut > svg[viewBox="0 0 120 120"](-90° 起笔)
2991
+ * .chart-donut > .chart-legend
2992
+ */
2993
+
2994
+ .chart-donut {
2995
+ display: flex;
2996
+ align-items: center;
2997
+ gap: var(--density-space-md);
2998
+ min-height: 150px;
2999
+ }
3000
+ .chart-donut > svg {
3019
3001
  width: 132px;
3002
+ height: 132px;
3020
3003
  flex-shrink: 0;
3021
3004
  }
3022
- .chart-gauge > svg {
3005
+ .chart-donut-center {
3006
+ font-variant-numeric: tabular-nums;
3007
+ text-anchor: middle;
3008
+ fill: var(--token-text);
3009
+ font-weight: 600;
3010
+ }
3011
+
3012
+
3013
+ /* ── components/chart-radar.css ── */
3014
+ /*
3015
+ * @icen.ai/ui — Component: chart-radar(雷达图专属样式)
3016
+ * 依赖:charts.css(基座 .chart-legend)
3017
+ *
3018
+ * DOM 由 behaviors/charts.ts 的 renderRadar 构建:
3019
+ * .chart-radar > svg[viewBox="0 0 200 200"](N 轴蛛网 + 数据多边形)
3020
+ * > .chart-legend
3021
+ * 多系列时各系列分配 chart-tone-1..6,图例由 behavior 生成。
3022
+ */
3023
+
3024
+ .chart-radar > svg {
3023
3025
  display: block;
3024
- width: 132px;
3025
- height: 132px;
3026
+ width: 100%;
3027
+ max-width: 260px;
3028
+ height: auto;
3029
+ aspect-ratio: 1;
3030
+ overflow: visible;
3026
3031
  }
3027
- .chart-gauge-center {
3028
- position: absolute;
3029
- inset: 0;
3032
+ .chart-radar { gap: var(--density-space-md); }
3033
+
3034
+
3035
+ /* ── components/chart-sparkline.css ── */
3036
+ /*
3037
+ * @icen.ai/ui — Component: chart-sparkline(迷你趋势线专属样式)
3038
+ * 依赖:charts.css(基座)
3039
+ *
3040
+ * DOM 由 behaviors/charts.ts 的 renderSparkline 构建:
3041
+ * .chart-sparkline > svg[viewBox="0 0 96 28"](无轴,末点高亮)
3042
+ */
3043
+
3044
+ .chart-sparkline > svg {
3045
+ display: block;
3046
+ width: 96px;
3047
+ height: 28px;
3048
+ overflow: visible;
3049
+ }
3050
+
3051
+
3052
+ /* ── components/chart-stack.css ── */
3053
+ /*
3054
+ * @icen.ai/ui — Component: chart-stack(堆叠条图专属样式)
3055
+ * 依赖:charts.css(基座 .chart-legend)
3056
+ *
3057
+ * DOM 由 behaviors/charts.ts 的 renderStack 构建:
3058
+ * .chart-stack > .chart-stack-seg[]
3059
+ * .chart-legend
3060
+ */
3061
+
3062
+ .chart-stack {
3063
+ height: 16px;
3064
+ display: flex;
3065
+ overflow: hidden;
3066
+ border-radius: var(--radius-full);
3067
+ background: var(--token-fill-2);
3068
+ margin-bottom: var(--density-space-sm);
3069
+ }
3070
+ .chart-stack-seg {
3071
+ height: 100%;
3072
+ min-width: 3px;
3073
+ background: var(--chart-tone, var(--token-accent));
3074
+ transition: width var(--icen-tx-slow);
3075
+ }
3076
+ .chart-stack-seg:hover {
3077
+ filter: brightness(1.08);
3078
+ }
3079
+
3080
+ @media (prefers-reduced-motion: reduce) {
3081
+ .chart-stack-seg { transition: none; }
3082
+ }
3083
+
3084
+
3085
+ /* ── components/charts.css ── */
3086
+ /*
3087
+ * @icen.ai/ui — Component: charts base(图表共享基座,与 behaviors/charts 配套)
3088
+ *
3089
+ * 仅含所有图表类型共用的契约:.chart 容器、.chart-empty 空态、.chart-legend 图例、
3090
+ * .chart-labels 轴标签行、.chart-tone-* 调色盘。
3091
+ * 各图表类型的专属样式在独立 CSS 文件中(chart-line / chart-bar / chart-pie /
3092
+ * chart-stack / chart-heatmap / chart-sparkline / chart-gauge / chart-radar / chart-area),
3093
+ * 按需引入——kit/chart-<type> 入口会自动带上本基座 + 对应专属 CSS。
3094
+ *
3095
+ * 单色调通过容器或条上的 --chart-tone 自定义属性注入(默认 var(--token-accent))。
3096
+ */
3097
+
3098
+ .chart {
3099
+ width: 100%;
3030
3100
  display: flex;
3031
3101
  flex-direction: column;
3102
+ gap: var(--density-space-sm);
3103
+ }
3104
+ .chart-empty {
3105
+ height: 150px;
3106
+ display: flex;
3032
3107
  align-items: center;
3033
3108
  justify-content: center;
3034
- gap: 1px;
3109
+ font-size: var(--density-font-size-xs);
3110
+ color: var(--token-text-faint);
3035
3111
  }
3036
- .chart-gauge-value {
3037
- font-size: 20px;
3038
- font-weight: 700;
3039
- font-variant-numeric: tabular-nums;
3040
- color: var(--token-text);
3112
+
3113
+ /* ── 图例 / 轴标签(donut / stack / vbar / line 共用) ── */
3114
+ .chart-legend {
3115
+ display: flex;
3116
+ flex-direction: column;
3117
+ gap: 6px;
3118
+ min-width: 0;
3119
+ flex: 1;
3041
3120
  }
3042
- .chart-gauge-label {
3121
+ .chart-legend-item {
3122
+ display: flex;
3123
+ align-items: center;
3124
+ gap: var(--density-space-xs);
3043
3125
  font-size: var(--density-font-size-xs);
3126
+ min-width: 0;
3127
+ }
3128
+ .chart-legend-dot {
3129
+ width: 8px;
3130
+ height: 8px;
3131
+ flex-shrink: 0;
3132
+ border-radius: var(--radius-full);
3133
+ background: var(--chart-tone, var(--token-accent));
3134
+ }
3135
+ .chart-legend-label {
3136
+ flex: 1;
3137
+ min-width: 0;
3138
+ overflow: hidden;
3139
+ text-overflow: ellipsis;
3140
+ white-space: nowrap;
3141
+ color: var(--token-text-muted);
3142
+ }
3143
+ .chart-legend-value {
3144
+ flex-shrink: 0;
3145
+ font-variant-numeric: tabular-nums;
3146
+ color: var(--token-text-faint);
3147
+ }
3148
+
3149
+ .chart-labels {
3150
+ display: flex;
3151
+ gap: var(--density-space-xs);
3152
+ margin-top: var(--density-space-xs);
3153
+ }
3154
+ .chart-labels > span {
3155
+ flex: 1;
3156
+ min-width: 0;
3157
+ text-align: center;
3158
+ font-size: 9px;
3044
3159
  color: var(--token-text-faint);
3160
+ overflow: hidden;
3161
+ text-overflow: ellipsis;
3162
+ white-space: nowrap;
3163
+ font-variant-numeric: tabular-nums;
3045
3164
  }
3046
3165
 
3047
- /* ── 调色盘:多系列图(donut/stack/line)由 behavior 选用 ── */
3166
+ /* ── 调色盘:多系列图(donut/stack/line/radar)由 behavior 选用 ── */
3048
3167
  .chart-tone-1 { --chart-tone: var(--token-accent); }
3049
3168
  .chart-tone-2 { --chart-tone: var(--token-accent-cold); }
3050
3169
  .chart-tone-3 { --chart-tone: var(--token-success); }
@@ -3052,10 +3171,6 @@ html {
3052
3171
  .chart-tone-5 { --chart-tone: var(--token-info); }
3053
3172
  .chart-tone-6 { --chart-tone: color-mix(in srgb, var(--token-text) 50%, transparent); }
3054
3173
 
3055
- @media (prefers-reduced-motion: reduce) {
3056
- .chart-vbar-bar, .chart-hbar-bar, .chart-stack-seg { transition: none; }
3057
- }
3058
-
3059
3174
 
3060
3175
  /* ── components/content.css ── */
3061
3176
  /*
@@ -3782,6 +3897,92 @@ html {
3782
3897
  .dt-filter-panel { animation: none; }
3783
3898
  }
3784
3899
 
3900
+ /* ── 紧凑密度(32px 行高) ── */
3901
+ .datatable--compact .dt-cell { min-height: 32px; padding: 0 10px; }
3902
+ .datatable--compact .dt-cell--head { min-height: 32px; font-size: var(--density-font-size-xs); }
3903
+
3904
+ /* ── 工具栏右侧操作按钮组 ── */
3905
+ .dt-toolbar-actions {
3906
+ margin-left: auto;
3907
+ display: flex;
3908
+ align-items: center;
3909
+ gap: 4px;
3910
+ }
3911
+ .dt-tool-btn {
3912
+ display: inline-flex;
3913
+ align-items: center;
3914
+ justify-content: center;
3915
+ width: 28px;
3916
+ height: 28px;
3917
+ flex-shrink: 0;
3918
+ border: 1px solid var(--token-line-soft);
3919
+ border-radius: var(--radius-sm);
3920
+ background: transparent;
3921
+ color: var(--token-text-faint);
3922
+ cursor: pointer;
3923
+ transition: color var(--icen-tx-fast), border-color var(--icen-tx-fast), background var(--icen-tx-fast);
3924
+ }
3925
+ .dt-tool-btn:hover {
3926
+ color: var(--token-text);
3927
+ border-color: var(--token-accent);
3928
+ background: var(--token-fill-1);
3929
+ }
3930
+
3931
+ /* ── 列宽拖拽手柄 ── */
3932
+ .dt-resize {
3933
+ position: absolute;
3934
+ top: 0;
3935
+ right: 0;
3936
+ bottom: 0;
3937
+ width: 6px;
3938
+ cursor: col-resize;
3939
+ user-select: none;
3940
+ touch-action: none;
3941
+ z-index: 1;
3942
+ }
3943
+ .dt-resize::after {
3944
+ content: '';
3945
+ position: absolute;
3946
+ top: 25%;
3947
+ bottom: 25%;
3948
+ right: 2px;
3949
+ width: 2px;
3950
+ border-radius: 1px;
3951
+ background: transparent;
3952
+ transition: background var(--icen-tx-fast);
3953
+ }
3954
+ .dt-resize:hover::after,
3955
+ .dt-resize:active::after {
3956
+ background: var(--token-accent);
3957
+ }
3958
+ .dt-cell--head { /* 确保相对定位供 resize 绝对定位 */ }
3959
+
3960
+ /* ── 冻结列(左固定 sticky) ── */
3961
+ .datatable--frozen .dt-cell--frozen {
3962
+ position: sticky;
3963
+ z-index: var(--z-raised);
3964
+ background: var(--token-surface);
3965
+ }
3966
+ .datatable--frozen .dt-row--head .dt-cell--frozen {
3967
+ z-index: calc(var(--z-raised) + 1);
3968
+ background: var(--token-bg-soft);
3969
+ }
3970
+ .datatable--frozen .dt-row.is-selected .dt-cell--frozen {
3971
+ background: var(--token-accent-subtle);
3972
+ }
3973
+ .datatable--frozen .dt-body .dt-row:hover .dt-cell--frozen {
3974
+ background: var(--token-fill-1);
3975
+ }
3976
+ .datatable--frozen .dt-row.is-selected:hover .dt-cell--frozen {
3977
+ background: color-mix(in srgb, var(--token-accent-subtle) 82%, var(--token-fill-1));
3978
+ }
3979
+
3980
+ /* ── 行状态类(rowClassName 产出) ── */
3981
+ .dt-row--danger { background: color-mix(in srgb, var(--token-error) 6%, transparent) !important; }
3982
+ .dt-row--danger:hover { background: color-mix(in srgb, var(--token-error) 10%, transparent) !important; }
3983
+ .dt-row--warning { background: color-mix(in srgb, var(--token-warning) 6%, transparent) !important; }
3984
+ .dt-row--success { background: color-mix(in srgb, var(--token-success) 6%, transparent) !important; }
3985
+
3785
3986
 
3786
3987
  /* ── components/empty.css ── */
3787
3988
  /*
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@icen.ai/ui",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Icen Design System — 设计 tokens(6 预设 × 明暗)、无框架组件 CSS 与行为 JS",
5
5
  "repository": {
6
6
  "type": "git",