Skip to content

Commit caea1d3

Browse files
feat: add typed CssBorderCollapse property support
Add CssBorderCollapse sealed class with separate/collapse keywords and standard escape hatches (variable, raw, global). Wire it into Style.typed() as borderCollapse parameter. Closes #67
1 parent f1d2073 commit caea1d3

5 files changed

Lines changed: 88 additions & 0 deletions

File tree

packages/spark_css/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
- **Feat**: Added `accent-color` CSS property support via `CssColor? accentColor` parameter in `Style.typed()`.
1111
- **Feat**: Added `CssAnimation` sealed class for the `animation` shorthand property with `.none`, single animation (name, duration, timingFunction, delay, iterationCount, direction, fillMode, playState), `.multiple()`, plus `.variable()`, `.raw()`, and `.global()` escape hatches.
1212
- **Feat**: Added `CssAnimationDirection`, `CssAnimationFillMode`, `CssAnimationPlayState`, and `CssAnimationIterationCount` sealed classes for animation sub-properties. Reuses existing `CssDuration` and `CssTimingFunction` from `CssTransition`.
13+
- **Feat**: Added `CssBorderCollapse` sealed class for `border-collapse` property with `.separate`, `.collapse` keywords, plus `.variable()`, `.raw()`, and `.global()` escape hatches.
1314

1415
### Changed
1516

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import 'css_value.dart';
2+
3+
/// CSS border-collapse property values.
4+
sealed class CssBorderCollapse implements CssValue {
5+
const CssBorderCollapse._();
6+
7+
static const CssBorderCollapse separate = _CssBorderCollapseKeyword(
8+
'separate',
9+
);
10+
static const CssBorderCollapse collapse = _CssBorderCollapseKeyword(
11+
'collapse',
12+
);
13+
14+
/// CSS variable reference.
15+
factory CssBorderCollapse.variable(String varName) =
16+
_CssBorderCollapseVariable;
17+
18+
/// Raw CSS value escape hatch.
19+
factory CssBorderCollapse.raw(String value) = _CssBorderCollapseRaw;
20+
21+
/// Global keyword (inherit, initial, unset, revert).
22+
factory CssBorderCollapse.global(CssGlobal global) = _CssBorderCollapseGlobal;
23+
}
24+
25+
final class _CssBorderCollapseKeyword extends CssBorderCollapse {
26+
final String keyword;
27+
const _CssBorderCollapseKeyword(this.keyword) : super._();
28+
29+
@override
30+
String toCss() => keyword;
31+
}
32+
33+
final class _CssBorderCollapseVariable extends CssBorderCollapse {
34+
final String varName;
35+
const _CssBorderCollapseVariable(this.varName) : super._();
36+
37+
@override
38+
String toCss() => 'var(--$varName)';
39+
}
40+
41+
final class _CssBorderCollapseRaw extends CssBorderCollapse {
42+
final String value;
43+
const _CssBorderCollapseRaw(this.value) : super._();
44+
45+
@override
46+
String toCss() => value;
47+
}
48+
49+
final class _CssBorderCollapseGlobal extends CssBorderCollapse {
50+
final CssGlobal global;
51+
const _CssBorderCollapseGlobal(this.global) : super._();
52+
53+
@override
54+
String toCss() => global.toCss();
55+
}

packages/spark_css/lib/src/css_types/css_types.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export 'css_background_position.dart';
1212
export 'css_background_repeat.dart';
1313
export 'css_background_size.dart';
1414
export 'css_border.dart';
15+
export 'css_border_collapse.dart';
1516
export 'css_border_radius.dart';
1617
export 'css_box_shadow.dart';
1718
export 'css_color.dart';

packages/spark_css/lib/src/style.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ class Style implements CssStyle {
291291
CssBorder? borderBottom,
292292
CssBorder? borderLeft,
293293
CssBorderRadius? borderRadius,
294+
CssBorderCollapse? borderCollapse,
294295
CssOutline? outline,
295296
CssLength? outlineOffset,
296297
// Visual
@@ -415,6 +416,9 @@ class Style implements CssStyle {
415416
if (borderRadius != null) {
416417
_properties['border-radius'] = borderRadius.toCss();
417418
}
419+
if (borderCollapse != null) {
420+
_properties['border-collapse'] = borderCollapse.toCss();
421+
}
418422
if (outline != null) _properties['outline'] = outline.toCss();
419423
if (outlineOffset != null) {
420424
_properties['outline-offset'] = outlineOffset.toCss();
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import 'package:spark_css/spark_css.dart';
2+
import 'package:test/test.dart';
3+
4+
void main() {
5+
group('CssBorderCollapse', () {
6+
test('keywords output correct CSS', () {
7+
expect(CssBorderCollapse.separate.toCss(), equals('separate'));
8+
expect(CssBorderCollapse.collapse.toCss(), equals('collapse'));
9+
});
10+
test('variable outputs correct CSS', () {
11+
expect(CssBorderCollapse.variable('bc').toCss(), equals('var(--bc)'));
12+
});
13+
test('raw outputs value as-is', () {
14+
expect(CssBorderCollapse.raw('collapse').toCss(), equals('collapse'));
15+
});
16+
test('global outputs correct CSS', () {
17+
expect(
18+
CssBorderCollapse.global(CssGlobal.inherit).toCss(),
19+
equals('inherit'),
20+
);
21+
});
22+
test('Style.typed integration', () {
23+
final style = Style.typed(borderCollapse: CssBorderCollapse.collapse);
24+
expect(style.toCss(), contains('border-collapse: collapse;'));
25+
});
26+
});
27+
}

0 commit comments

Comments
 (0)