twico-ui 1.47.0 → 1.48.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/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  All notable changes to Twico UI are documented here (newest first). This file is generated automatically on each release by [semantic-release](https://semantic-release.gitbook.io/) from [Conventional Commits](https://www.conventionalcommits.org/) — do not edit it by hand. The same notes appear on each [GitHub Release](https://github.com/EncryptionL/twico-ui/releases).
4
4
 
5
+ # [1.48.0](https://github.com/EncryptionL/twico-ui/compare/v1.47.0...v1.48.0) (2026-10-23)
6
+
7
+
8
+ ### Features
9
+
10
+ * **datatable:** vertical alignment at three levels — table, row, column ([221978b](https://github.com/EncryptionL/twico-ui/commit/221978b1db3527d97b93335a9b36b9274d2c8b10))
11
+
5
12
  # [1.47.0](https://github.com/EncryptionL/twico-ui/compare/v1.46.0...v1.47.0) (2026-10-23)
6
13
 
7
14
 
package/dist/icons.d.cts CHANGED
@@ -56,4 +56,5 @@ declare const brandIcons: BrandIconMeta[];
56
56
  /** Just the exported component names of every brand icon. */
57
57
  declare const brandIconNames: string[];
58
58
 
59
- export { AppleBrandIcon, BlueskyIcon, type BrandIcon, type BrandIconMeta, type BrandIconProps, DiscordIcon, DockerIcon, DribbbleIcon, FacebookIcon, FigmaIcon, GithubIcon, GitlabIcon, GoogleIcon, InstagramIcon, MastodonIcon, MediumIcon, NextjsIcon, NodejsIcon, NpmIcon, PinterestIcon, ReactjsIcon, RedditIcon, SpotifyIcon, StackOverflowIcon, TailwindIcon, TelegramIcon, ThreadsIcon, TikTokIcon, TwitchIcon, TypeScriptIcon, VercelIcon, WhatsAppIcon, XTwitterIcon, YoutubeIcon, brandIconNames, brandIcons };
59
+ export { AppleBrandIcon, BlueskyIcon, DiscordIcon, DockerIcon, DribbbleIcon, FacebookIcon, FigmaIcon, GithubIcon, GitlabIcon, GoogleIcon, InstagramIcon, MastodonIcon, MediumIcon, NextjsIcon, NodejsIcon, NpmIcon, PinterestIcon, ReactjsIcon, RedditIcon, SpotifyIcon, StackOverflowIcon, TailwindIcon, TelegramIcon, ThreadsIcon, TikTokIcon, TwitchIcon, TypeScriptIcon, VercelIcon, WhatsAppIcon, XTwitterIcon, YoutubeIcon, brandIconNames, brandIcons };
60
+ export type { BrandIcon, BrandIconMeta, BrandIconProps };
package/dist/icons.d.ts CHANGED
@@ -56,4 +56,5 @@ declare const brandIcons: BrandIconMeta[];
56
56
  /** Just the exported component names of every brand icon. */
57
57
  declare const brandIconNames: string[];
58
58
 
59
- export { AppleBrandIcon, BlueskyIcon, type BrandIcon, type BrandIconMeta, type BrandIconProps, DiscordIcon, DockerIcon, DribbbleIcon, FacebookIcon, FigmaIcon, GithubIcon, GitlabIcon, GoogleIcon, InstagramIcon, MastodonIcon, MediumIcon, NextjsIcon, NodejsIcon, NpmIcon, PinterestIcon, ReactjsIcon, RedditIcon, SpotifyIcon, StackOverflowIcon, TailwindIcon, TelegramIcon, ThreadsIcon, TikTokIcon, TwitchIcon, TypeScriptIcon, VercelIcon, WhatsAppIcon, XTwitterIcon, YoutubeIcon, brandIconNames, brandIcons };
59
+ export { AppleBrandIcon, BlueskyIcon, DiscordIcon, DockerIcon, DribbbleIcon, FacebookIcon, FigmaIcon, GithubIcon, GitlabIcon, GoogleIcon, InstagramIcon, MastodonIcon, MediumIcon, NextjsIcon, NodejsIcon, NpmIcon, PinterestIcon, ReactjsIcon, RedditIcon, SpotifyIcon, StackOverflowIcon, TailwindIcon, TelegramIcon, ThreadsIcon, TikTokIcon, TwitchIcon, TypeScriptIcon, VercelIcon, WhatsAppIcon, XTwitterIcon, YoutubeIcon, brandIconNames, brandIcons };
60
+ export type { BrandIcon, BrandIconMeta, BrandIconProps };
package/dist/index.cjs CHANGED
@@ -9378,9 +9378,20 @@ var DT_CSS = `
9378
9378
  font-size: var(--text-sm); color: var(--color-text); background: var(--twc-dt-row-bg, var(--color-surface));
9379
9379
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 0; }
9380
9380
  /* Wrap-text columns: content flows onto multiple lines (the row grows down) instead of
9381
- clipping to one line. height stays a per-row minimum, so single-line cells are unchanged. */
9381
+ clipping to one line. height stays a per-row minimum, so single-line cells are unchanged.
9382
+ The top alignment here is only a DEFAULT for wrapped cells - an explicit verticalAlign at any
9383
+ level resolves to data-valign below, which is more specific and wins. Before that existed, a row
9384
+ mixing a wrapped column with normal ones was silently inconsistent: the wrapped cell sat top and
9385
+ its neighbours sat middle, with no way to say otherwise. */
9382
9386
  .twc-dt__td[data-wrap="true"] { white-space: normal; overflow: hidden; text-overflow: clip;
9383
9387
  word-break: break-word; overflow-wrap: anywhere; vertical-align: top; padding-block: 10px; line-height: 1.45; }
9388
+ /* Vertical alignment. One attribute, already resolved: column > row > table default, computed in
9389
+ renderLeaf rather than left to three competing selectors, so the precedence is readable in the
9390
+ code and cannot be reordered by an unrelated CSS edit. Matters whenever rows vary in height -
9391
+ wrapText, a multi-line renderCell, or a drag-resized row. */
9392
+ .twc-dt__td[data-valign="top"] { vertical-align: top; }
9393
+ .twc-dt__td[data-valign="middle"] { vertical-align: middle; }
9394
+ .twc-dt__td[data-valign="bottom"] { vertical-align: bottom; }
9384
9395
  /* #338: "combined" column cell \u2014 one column showing several source columns' values. */
9385
9396
  .twc-dt__combine--stack { display: flex; flex-direction: column; gap: 1px; }
9386
9397
  .twc-dt__combine-sep { color: var(--color-text-subtle); padding-inline: 3px; }
@@ -10149,6 +10160,8 @@ function Datatable({
10149
10160
  batchActions = [],
10150
10161
  onRowSelectionChange,
10151
10162
  selectionSummary,
10163
+ verticalAlign,
10164
+ getRowVerticalAlign,
10152
10165
  getRowStyle,
10153
10166
  getRowClassName,
10154
10167
  showExport = false,
@@ -12728,6 +12741,7 @@ function Datatable({
12728
12741
  const h = rowHeights[k];
12729
12742
  const userRowStyle = getRowStyle ? getRowStyle(row, ri) : void 0;
12730
12743
  const userRowClass = getRowClassName ? getRowClassName(row, ri) : void 0;
12744
+ const rowValign = getRowVerticalAlign ? getRowVerticalAlign(row, ri) : void 0;
12731
12745
  const { background: _rowBgShorthand, backgroundColor: _rowBgColor, ...restRowStyle } = userRowStyle || {};
12732
12746
  const usable = (v) => typeof v === "string" && v.trim() !== "" ? v : void 0;
12733
12747
  const rowBg = usable(_rowBgShorthand) ?? usable(_rowBgColor);
@@ -12838,6 +12852,7 @@ function Datatable({
12838
12852
  "data-num": c.type === "number" || void 0,
12839
12853
  "data-actions": isActions || void 0,
12840
12854
  "data-align": c.align !== dtNaturalAlign(c) ? c.align : void 0,
12855
+ "data-valign": c.verticalAlign ?? rowValign ?? verticalAlign,
12841
12856
  "data-editable": editable && !isEditing || void 0,
12842
12857
  "data-editing": isEditing || void 0,
12843
12858
  "data-cell-active": cellActive || void 0,