Skip to content

Commit fc0bb6c

Browse files
Merge pull request #102 from KLEAK-Development/feat/css-box-sizing-property
Add `box-sizing` CSS property support
2 parents 4f52c0a + d186894 commit fc0bb6c

5 files changed

Lines changed: 78 additions & 0 deletions

File tree

packages/spark_css/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
- **Feat**: Added `CssAnimationDirection`, `CssAnimationFillMode`, `CssAnimationPlayState`, and `CssAnimationIterationCount` sealed classes for animation sub-properties. Reuses existing `CssDuration` and `CssTimingFunction` from `CssTransition`.
1313
- **Feat**: Added `CssBorderCollapse` sealed class for `border-collapse` property with `.separate`, `.collapse` keywords, plus `.variable()`, `.raw()`, and `.global()` escape hatches.
1414
- **Feat**: Added `border-top-color`, `border-right-color`, `border-bottom-color`, and `border-left-color` CSS property support via `CssColor?` parameters in `Style.typed()`.
15+
- **Feat**: Added `CssBoxSizing` sealed class for `box-sizing` property with `.contentBox`, `.borderBox` keywords, plus `.variable()`, `.raw()`, and `.global()` escape hatches.
1516

1617
### Changed
1718

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

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export 'css_border.dart';
1515
export 'css_border_collapse.dart';
1616
export 'css_border_radius.dart';
1717
export 'css_box_shadow.dart';
18+
export 'css_box_sizing.dart';
1819
export 'css_color.dart';
1920
export 'css_cursor.dart';
2021
export 'css_display.dart';

packages/spark_css/lib/src/style.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,7 @@ class Style implements CssStyle {
306306
CssZIndex? zIndex,
307307
CssCursor? cursor,
308308
CssBoxShadow? boxShadow,
309+
CssBoxSizing? boxSizing,
309310
CssFilter? filter,
310311
CssFilter? backdropFilter,
311312
// Backgrounds
@@ -448,6 +449,7 @@ class Style implements CssStyle {
448449
if (zIndex != null) _properties['z-index'] = zIndex.toCss();
449450
if (cursor != null) _properties['cursor'] = cursor.toCss();
450451
if (boxShadow != null) _properties['box-shadow'] = boxShadow.toCss();
452+
if (boxSizing != null) _properties['box-sizing'] = boxSizing.toCss();
451453
if (filter != null) _properties['filter'] = filter.toCss();
452454
if (backdropFilter != null) {
453455
_properties['backdrop-filter'] = backdropFilter.toCss();
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import 'package:spark_css/spark_css.dart';
2+
import 'package:test/test.dart';
3+
4+
void main() {
5+
group('CssBoxSizing', () {
6+
test('keywords output correct CSS', () {
7+
expect(CssBoxSizing.contentBox.toCss(), equals('content-box'));
8+
expect(CssBoxSizing.borderBox.toCss(), equals('border-box'));
9+
});
10+
test('variable outputs correct CSS', () {
11+
expect(CssBoxSizing.variable('bs').toCss(), equals('var(--bs)'));
12+
});
13+
test('raw outputs value as-is', () {
14+
expect(CssBoxSizing.raw('border-box').toCss(), equals('border-box'));
15+
});
16+
test('global outputs correct CSS', () {
17+
expect(CssBoxSizing.global(CssGlobal.inherit).toCss(), equals('inherit'));
18+
});
19+
test('Style.typed integration', () {
20+
final style = Style.typed(boxSizing: CssBoxSizing.borderBox);
21+
expect(style.toCss(), contains('box-sizing: border-box;'));
22+
});
23+
});
24+
}

0 commit comments

Comments
 (0)