home readme diff tree note docs

0commit f30761f040dd4c899a0d9c420156ae2bf50bd6aa
1Author: Mason Wright <mason@lakefox.net>
2Date:   Sun Oct 26 21:10:25 2025 -0600
3
4    Going to remove kAccepts
5
6diff --git a/docs/content/adding/adding-css-properties.3 b/docs/content/adding/adding-css-properties.3
7new file mode 100644
8index 0000000..a43e95c
9--- /dev/null
10+++ b/docs/content/adding/adding-css-properties.3
11@@ -0,0 +1,35 @@
12+.TH css adding 2025-10-18 "grim"
13+.Nm Grim
14+.SH DESCRIPTION
15+.BI SCOPE: 
16+.UR 
17+src/css_parser.cc
18+.UE
19+.BR
20+.UR
21+include/grim.h
22+.UE
23+.br
24+The purpose of this document is to outline the process of adding new styles to CSS.
25+
26+.SH Defining a Property
27+CSS Properties are parsed into ENUM's:
28+.RS
29+.B
30+Property
31+names are stored in KeyType
32+.br
33+.B
34+Values
35+are stored in UnitType
36+.br
37+.B
38+Accepted
39+values are mapped into kAccepts
40+.RE
41+.P
42+.SH The process of converting a property
43+Once the CSS object has been parsed by the parseCSS function it will loop through the properties it found within the object. 
44+It will search for the
45+.B KeyType
46+in the keySearch map, if it is found it will pass the KeyType and the string containing the value of the property to getUnits.
47diff --git a/include/grim.h b/include/grim.h
48index 64ee1c7..e67414f 100755
49--- a/include/grim.h
50+++ b/include/grim.h
51@@ -145,11 +145,9 @@ std::vector<std::vector<std::string>> parseSelectorParts(std::string_view);
52 
53 bool testSelector(Node*, std::vector<std::vector<std::string>>);
54 
55-enum class UnitType {
56-	// Operator 
57-		EQ, LT, GT, LE, GE, ADD, SUB, MULT, DIV,
58+enum class UnitType : char {
59 	// Color
60-		HEX, RGB, RGBA, HSL, HSLA, COLOR,
61+		HEX, RGB, RGBA, HSL,
62 	// Logic
63 		AND, OR, NOT, ONLY, COMMA,
64 	// Length 
65@@ -161,60 +159,75 @@ enum class UnitType {
66 		DEG, RAD, GRAD, TURN,
67 	// Non-unit numbers
68 		NUMBER, INF, NEGINF, NaN, E, PI,
69+
70+
71+
72+	// Global
73+		INHERIT, INITIAL, REVERT, REVERT_LAYER, UNSET, AUTO, NONE,
74+	// Operator 
75+		EQ, LT, GT, LE, GE, ADD, SUB, MULT, DIV,
76 	// Baseline Position
77 		FIRST, LAST,
78 	// Box Edge
79-		BOX_EDGE, CONTENT, PADDING, BORDER, MARGIN, FILL, STROKE, VIEW,
80-	// Content-distribution
81-		CONTENT_DISTRIBUTION, BETWEEN, AROUND, EVENLY, STRETCH,
82-	// Content-position
83-		CONTENT_POSITION, CENTER, START, FLEX_START, FLEX_END,
84+		CONTENT, PADDING, BORDER, MARGIN, FILL, STROKE, VIEW,
85+	// Distribution
86+		NORMAL, STRETCH, BETWEEN, AROUND, EVENLY,
87+	// Position
88+		CENTER, START, END, TOP, LEFT, BOTTOM, RIGHT, INLINE_START, INLINE_END, BLOCK_START, BLOCK_END, SELF_START, SELF_END, FLEX_START, FLEX_END,
89+		FLEX_START, FLEX_END,
90+	// Overflow
91+		CLIP, SCROLL,
92+		SAFE, UNSAFE,
93+	// Display
94+		HIDDEN, VISIBLE,  
95 	// Display Box
96-		DISPLAY_BOX, CONTENTS, NONE,
97+		CONTENTS, 
98 	// Display Inside
99-		DISPLAY_INSIDE, FLOW, FLOW_ROOT, TABLE, FLEX, GRID, RUBY,
100+		FLOW, FLOW_ROOT, TABLE, FLEX, GRID, RUBY,
101 	// Display Internal
102-		DISPLAY_INTERNAL, TABLE_ROW_GROUP, TABLE_HEADER_GROUP, TABLE_FOOTER_GROUP, TABLE_COLUMN_GROUP,
103+		TABLE_ROW_GROUP, TABLE_HEADER_GROUP, TABLE_FOOTER_GROUP, TABLE_COLUMN_GROUP,
104 		TABLE_ROW, TABLE_CELL, TABLE_COLUMN, TABLE_CAPTION, RUBY_BASE, RUBY_TEXT, RUBY_BASE_CONTAINER,
105 		RUBY_TEXT_CONTAINER,
106 	// Display Legacy
107-		DISPLAY_LEGACY, INLINE_BLOCK, INLINE_TABLE, INLINE_GRID, INLINE_FLEX,
108+		INLINE_BLOCK, INLINE_TABLE, INLINE_GRID, INLINE_FLEX,
109 	// Display List Item
110-		DISPLAY_LISTITEM, LISTITEM,
111+		LISTITEM,
112 	// Display Outside
113-		DISPLAY_OUTSIDE, BLOCK, INLINE, RUN_IN,
114-	// Easing Functions
115-		EASING_FUNCTION, LINEAR_EASING_FUNCTION, LINEAR, EASE, EASE_IN, EASE_OUT, EASE_IN_OUT, CUBIC_BEZIER_FUNCTION, 
116-		STEP_START, STEP_END, STEPS_FUNCTION, JUMP_START, JUMP_END, JUMP_NONE, JUMP_BOTH, 
117-	// Function
118-		CALC, MIN, BLUR, BRIGHTNESS, CONTRAST, DROP_SHADOW, GRAYSCALE, HUE_ROTATE, INVERT, OPACITY, SEPIA, SATURATE,
119-	// Position
120-		POSITION, TOP, LEFT, BOTTOM, RIGHT, INLINE_START, INLINE_END, BLOCK_START, BLOCK_END, SELF_START, SELF_END, FLEX_START, FLEX_END,
121+		BLOCK, INLINE, RUN_IN,
122 	// Shape
123-		SHAPE, RADIAL_SHAPE, CIRCLE, ELLIPSE,
124+		RADIAL_SHAPE, CIRCLE, ELLIPSE,
125 	// Generic Family
126-		GENERIC_FAMILY, SERIF, SANS_SERIF, MONOSPACE, CURSIVE, FANTASY, SYSTEM_UI, UI_SERIF, UI_SANS_SERIF, UI_MONOSPACE, 
127+		SERIF, SANS_SERIF, MONOSPACE, CURSIVE, FANTASY, SYSTEM_UI, UI_SERIF, UI_SANS_SERIF, UI_MONOSPACE, 
128 		UI_ROUNDED, MATH, FANGSONG,
129 	// Hue Interpolation
130-		HUE_INTERPOLATION, SHORTER_HUE, LONGER_HUE, INCREASING_HUE, DECREASING_HUE,
131-		HUE,
132+		SHORTER_HUE, LONGER_HUE, INCREASING_HUE, DECREASING_HUE, HUE,
133 	// Line Style
134-		LINE_STYLE, HIDDEN, DOTTED, DASHED, SOLID, DOUBLE, GROOVE, RIDGE, INSET, OUTSET,
135+		DOTTED, DASHED, SOLID, DOUBLE, GROOVE, RIDGE, INSET, OUTSET,
136 	// Image
137-		IMAGE, URL, IMAGE_SET, CROSS_FADE, ELEMENT, GRADIENT,
138-	// Overflow Position
139-		OVERFLOW_POSITION, SAFE, UNSAFE,
140-	// Overflow
141-		OVERFLOW, VISIBLE, CLIP, SCROLL, AUTO, 
142+		URL, IMAGE_SET, CROSS_FADE, ELEMENT, GRADIENT,
143+	// Appearance																			 *Not added*
144+		MENU_LIST, TEXTFIELD, BASE_SELECT, BUTTON, CHECKBOX,
145+	// Space
146+		SPACE_BETWEEN, SPACE_AROUND, SPACE_EVENLY,
147+	// Background Attachment
148+		LOCAL, FIXED,
149+	// Background Blend Mode
150+		MULTIPLY, OVERLAY, DARKEN, LIGHTEN, COLOR_DODGE, COLOR_BURN, HARD_LIGHT, SOFT_LIGHT, DIFFERENCE, EXCLUSION, HUE, SATURATION, COLOR,  LUMINOSITY 
151+	// Background Clip
152+		BORDER_BOX, PADDING_BOX, CONTENT_BOX, TEXT, BORDER_AREA,
153+
154+
155+	// General Function
156+		CALC, MIN, BLUR, BRIGHTNESS, CONTRAST, DROP_SHADOW, GRAYSCALE, HUE_ROTATE, INVERT, OPACITY, SEPIA, SATURATE,
157+	// Easing Functions
158+		EASING_FUNCTION, LINEAR_EASING_FUNCTION, LINEAR, EASE, EASE_IN, EASE_OUT, EASE_IN_OUT, CUBIC_BEZIER_FUNCTION, 
159+		STEP_START, STEP_END, STEPS_FUNCTION, JUMP_START, JUMP_END, JUMP_NONE, JUMP_BOTH, 
160 	// Transform Functions
161 		MATRIX,	MATRIX3D, PERSPECTIVE, ROTATE, ROTATE3D, ROTATEX, ROTATEY, ROTATEZ, SCALE, SCALE3D, SCALEX, SCALEY, SCALEZ, TRANSLATE, TRANSLATE3D, TRANSLATEX, TRANSLATEY, TRANSLATEZ, 
162 		SKEW, SKEWX, SKEWY,
163-	// URL
164-		URL,
165+
166 	// Keyword
167-		PRINT, SCREEN, TOKEN, FUNC, OPERATOR, GROUP, END,
168-	// Property
169-		BACKGROUND_COLOR, BASELINE
170+		PRINT, SCREEN, TOKEN, FUNC, GROUP, NO_SUPPORT
171 };
172 
173 // 4 bytes
174@@ -226,12 +239,187 @@ union UnitValue {
175 	bool BOOL;
176 };
177 
178-// 8 bytes + vector
179+// 5 bytes 
180 struct Unit {
181-	UnitType type;
182+	UnitType type; // char
183 	UnitValue value;
184 };
185 
186+enum class KeyType : char {
187+	ACCENT_COLOR, ALIGN_CONTENT, ALIGN_ITEMS, ALIGN_SELF, ALL, APPEARANCE, ASPECT_RATIO,
188+	BACKDROP_FILTER, BACKGROUND_ATTACHMENT, BACKGROUND_BLEND_MODE, BACKGROUND_CLIP, BACKGROUND_COLOR,
189+	BACKGROUND_IMAGE,
190+
191+}
192+
193+/*
194+	std::vector is probally not a great way to store the accepted 
195+	UnitType's for a given key. However, that can be fixed later
196+*/
197+				// \/ Move to parser.cc \/ //
198+
199+static const std::unordered_map<std::string, KeyType> keySearch {
200+	{"accent-color", KeyType::ACCENT_COLOR},
201+	{"align-content", KeyType::ALIGN_CONTENT},
202+	{"align-items", KeyType::ALIGN_ITEMS},
203+	{"align-self", KeyType::ALIGN_SELF},
204+	{"all", KeyType::ALL},
205+	{"appearance", KeyType::APPEARANCE},
206+	{"aspect-ratio", KeyType::ASPECT_RATIO},
207+	{"backdrop-filter", KeyType::BACKDROP_FILTER},
208+	{"backface-visibility", KeyType::NO_SUPPORT},
209+	{"background-attachment", KeyType::BACKGROUND_ATTACHMENT},
210+	{"background-blend-mode", KeyType::BACKGROUND_BLEND_MODE},
211+	{"background-clip", KeyType::BACKGROUND_CLIP},
212+	{"background-color", KeyType::BACKGROUND_COLOR},
213+
214+}
215+
216+																// It is implided that all values have the global values
217+																// inherit inital revert revert-layer unset
218+
219+
220+
221+static const std::unordered_map<KeyType, std::vector<UnitType>> kAccepts {
222+	{KeyType::ACCENT_COLOR, {UnitType::AUTO, UnitType::HEX, UnitType::RGB, UnitType::RGBA, UnitType::HSL}},
223+	{
224+		KeyType::ALIGN_CONTENT,
225+		{
226+			UnitType::NORMAL, UnitType::START, UnitType::CENTER, UnitType::END,
227+			UnitType::FLEX_START, UnitType::FLEX_END, UnitType::BASELINE, UnitType::FIRST, UnitType::LAST, UnitType::SPACE_BETWEEN, 
228+			UnitType::SPACE_AROUND, UnitType::SPACE_EVENLY, UnitType::STRETCH, UnitType::SAFE, UnitType::UNSAFE, UnitType::CENTER
229+		}
230+	},
231+	{
232+		KeyType::ALIGN_ITEMS, 
233+		{
234+			UnitType::NORMAL, UnitType::START, UnitType::CENTER, UnitType::END, UnitType::FLEX_START, UnitType::FLEX_END, UnitType::SELF_START,
235+			UnitType::SELF_END, UnitType::ANCHOR_CENTER, UnitType::BASELINE, UnitType::FIRST, UnitType::LAST, UnitType::STRETCH,
236+			UnitType::SAFE, UnitType::UNSAFE, UnitType::CENTER
237+		}
238+	},
239+	{
240+		KeyType::ALIGN_SELF, 
241+		{
242+			UnitType::AUTO, UnitType::NORMAL, UnitType::START, UnitType::CENTER, UnitType::END, UnitType::FLEX_START, UnitType::FLEX_END,
243+			UnitType::SELF_START, UnitType::SELF_END, UnitType::ANCHOR_CENTER, UnitType::BASELINE, UnitType::FIRST, UnitType::LAST,
244+			UnitType::STRETCH, UnitType::SAFE, UnitType::UNSAFE, UnitType::CENTER
245+		}
246+	},
247+
248+	{
249+		// These are the global values but thats all "all" accepts so I put them there
250+		KeyType::ALL, 
251+		{
252+			UnitType::INTIAL, UnitType::INHERIT, UnitType::UNSET, UnitType::REVERT, UnitType::REVERT_LAYER
253+		}
254+	},
255+/*
256+	Missing:
257+anchor-name
258+animation-composition
259+animation-delay
260+animation-direction
261+animation-duration
262+animation-fill-mode
263+animation-iteration-count
264+animation-name
265+animation-play-state
266+animation-range-end
267+animation-range-start
268+animation-range (shorthand)
269+animation-timeline
270+animation-timing-function
271+animation (shorthand)
272+*/
273+	{
274+		KeyType::APPEARANCE, 
275+		{
276+			UnitType::NONE, UnitType::AUTO, UnitType::MENULIST_BUTTON, UnitType::TEXTFIELD, UnitType::BASE_SELECT, UnitType::BUTTON, UnitType::CHECKBOX
277+		}
278+	},
279+	{
280+		KeyType::ASPECT_RATIO, 
281+		{
282+			UnitType::NUMBER, UnitType::AUTO, UnitType::DIV
283+		}
284+	},
285+
286+	
287+	{
288+		KeyType::BACKDROP_FILTER, 
289+		{
290+			UnitType::NONE, UnitType::URL, UnitType::BLUR, UnitType::BRIGHTNESS, UnitType::CONTRAST, UnitType::DROP_SHADOW, UnitType::GRAYSCALE,
291+			UnitType::HURE_ROTATE, UnitType::INVERT, UnitType::OPACITY, UnitType::SEPIA, UnitType::SATURATE,
292+		}
293+	},
294+	{
295+		KeyType::BACKGROUND_ATTACHMENT, 
296+		{
297+			UnitType::SCROLL, UnitType::FIXED, UnitType::LOCAL,
298+		}
299+	},
300+	{
301+		KeyType::BACKGROUND_BLEND_MODE, 
302+		{
303+			UnitType::NORMAL,
304+			UnitType::MULTIPLY,
305+			UnitType::SCREEN,
306+			UnitType::OVERLAY,
307+			UnitType::DARKEN,
308+			UnitType::LIGHTEN,
309+			UnitType::COLOR_DODGE,
310+			UnitType::COLOR_BURN,
311+			UnitType::HARD_LIGHT,
312+			UnitType::SOFT_LIGHT,
313+			UnitType::DIFFERENCE,
314+			UnitType::EXCLUSION,
315+			UnitType::HUE,
316+			UnitType::SATURATION,
317+			UnitType::COLOR,
318+			UnitType::LUMINOSITY,
319+		}
320+	},
321+	{
322+		KeyType::BACKGROUD_CLIP, 
323+		{
324+			UnitType::BORDER_BOX,
325+			UnitType::PADDING_BOX,
326+			UnitType::CONTENT_BOX,
327+			UnitType::TEXT,
328+			UnitType::BORDER_AREA,
329+		}
330+	},
331+	{
332+		KeyType::BACKGROUND_COLOR, 
333+		{
334+			UnitType::HEX,
335+			UnitType::RGB,
336+			UnitType::RGBA,
337+			UnitType::HSL,
338+		}
339+	},
340+	{
341+		KeyType::, 
342+		{
343+			UnitType::,
344+		}
345+	},
346+	{
347+		KeyType::, 
348+		{
349+			UnitType::,
350+		}
351+	},
352+
353+	{
354+		KeyType::, 
355+		{
356+			UnitType::,
357+		}
358+	},
359+}
360+
361 enum class SheetType {
362 	CONTAINER,  COUNTER,    FONTFACE,  FONTFEATURE,  SWASH,  ANNOTATION,  ORNAMENTS,  STYLISTIC,  STYLESET,  CHARACTERVARIANT,  FONTPALETTEVALUES,
363 	IMPORT,     KEYFRAMES,  LAYER,     NAMESPACE,    PAGE,   PROPERTY,    ROOT,       SHEET,      MEDIA,     STARTINGSTYLE,     STYLE
364@@ -259,13 +447,12 @@ class Sheet {
365 		std::string name;
366 		std::string path;
367 		std::vector<std::vector<std::string>> selector;
368-		std::unordered_map<std::string, std::string> properties;
369+		std::vector<int> indexes;
370+		
371+		std::unordered_map<Key, std::vector<Unit>> properties;
372 
373 		SheetType type;
374 		std::unordered_map<std::string, std::string> variables;
375-
376-		Sheet* parent;
377-		std::vector<Sheet> children;
378 };
379 
380 class Window;
381diff --git a/src/parser.cc b/src/parser.cc
382index f29c1c2..36ecc5a 100755
383--- a/src/parser.cc
384+++ b/src/parser.cc
385@@ -580,125 +580,125 @@ static constexpr SuffixParse table[] = {
386 	{"s",     UnitType::SECOND,1},
387 };
388 
389-static const std::unordered_map<std::string_view, std::pair<UnitType, UnitType>> kMatch{
390-	{"+",{UnitType::OPERATOR, UnitType::ADD}},
391-	{"-",{UnitType::OPERATOR, UnitType::SUB}},
392-	{"*",{UnitType::OPERATOR, UnitType::MULT}},
393-	{"/",{UnitType::OPERATOR, UnitType::DIV}},
394-	{"==", {UnitType::OPERATOR, UnitType::EQ}},
395-	{">",{UnitType::OPERATOR, UnitType::GT}},
396-	{"<",{UnitType::OPERATOR, UnitType::LT}},
397-	{">=",{UnitType::OPERATOR, UnitType::GE}},
398-	{"<=",{UnitType::OPERATOR, UnitType::LE}},
399-	{"infinity",{UnitType::TOKEN, UnitType::INF}},
400-	{"-infinity",{UnitType::TOKEN, UnitType::NEGINF}},
401-	{"NaN",{UnitType::TOKEN, UnitType::NaN}},
402-	{"e",{UnitType::TOKEN, UnitType::E}},
403-	{"pi",{UnitType::TOKEN, UnitType::PI}},
404-	{"content-box",{UnitType::BOX_EDGE, UnitType::CONTENT}},
405-	{"padding-box",{UnitType::BOX_EDGE, UnitType::PADDING}},
406-	{"border-box",{UnitType::BOX_EDGE, UnitType::BORDER}},
407-	{"margin-box",{UnitType::BOX_EDGE, UnitType::MARGIN}},
408-	{"fill-box",{UnitType::BOX_EDGE, UnitType::FILL}},
409-	{"stroke-box",{UnitType::BOX_EDGE, UnitType::STROKE}},
410-	{"view-box",{UnitType::BOX_EDGE, UnitType::VIEW}},
411-	{"space-between",{UnitType::CONTENT_DISTRIBUTION, UnitType::BETWEEN}},
412-	{"space-around",{UnitType::CONTENT_DISTRIBUTION, UnitType::AROUND}},
413-	{"space-evenly",{UnitType::CONTENT_DISTRIBUTION, UnitType::EVENLY}},
414-	{"stretch",{UnitType::CONTENT_DISTRIBUTION, UnitType::STRETCH}},
415-	{"center",{UnitType::CONTENT_POSITION, UnitType::CENTER}},
416-	{"start",{UnitType::CONTENT_POSITION, UnitType::START}},
417-	{"end",{UnitType::CONTENT_POSITION, UnitType::END}},
418-	{"flex-start",{UnitType::CONTENT_POSITION, UnitType::FLEX_START}},
419-	{"flex-end",{UnitType::CONTENT_POSITION, UnitType::FLEX_END}},
420-	{"contents",{UnitType::DISPLAY_BOX, UnitType::CONTENTS}},
421-	{"none",{UnitType::DISPLAY_BOX, UnitType::NONE}},
422-	{"flow",{UnitType::DISPLAY_INSIDE, UnitType::FLOW}},
423-	{"flow-root",{UnitType::DISPLAY_INSIDE, UnitType::FLOW_ROOT}},
424-	{"table",{UnitType::DISPLAY_INSIDE, UnitType::TABLE}},
425-	{"flex",{UnitType::DISPLAY_INSIDE, UnitType::FLEX}},
426-	{"grid",{UnitType::DISPLAY_INSIDE, UnitType::GRID}},
427-	{"ruby",{UnitType::DISPLAY_INSIDE, UnitType::RUBY}},
428-	{"table-row-group",{UnitType::DISPLAY_INTERNAL, UnitType::TABLE_ROW_GROUP}},
429-	{"table-header-group",{UnitType::DISPLAY_INTERNAL, UnitType::TABLE_HEADER_GROUP}},
430-	{"table-footer-group",{UnitType::DISPLAY_INTERNAL, UnitType::TABLE_FOOTER_GROUP}},
431-	{"table-column-group",{UnitType::DISPLAY_INTERNAL, UnitType::TABLE_COLUMN_GROUP}},
432-	{"table-row",{UnitType::DISPLAY_INTERNAL, UnitType::TABLE_ROW}},
433-	{"table-cell",{UnitType::DISPLAY_INTERNAL, UnitType::TABLE_CELL}},
434-	{"table-column",{UnitType::DISPLAY_INTERNAL, UnitType::TABLE_COLUMN}},
435-	{"table-caption",{UnitType::DISPLAY_INTERNAL, UnitType::TABLE_CAPTION}},
436-	{"ruby-base",{UnitType::DISPLAY_INTERNAL, UnitType::RUBY_BASE}},
437-	{"ruby-text",{UnitType::DISPLAY_INTERNAL, UnitType::RUBY_TEXT}},
438-	{"ruby-base-container",{UnitType::DISPLAY_INTERNAL, UnitType::RUBY_BASE_CONTAINER}},
439-	{"ruby-text-container",{UnitType::DISPLAY_INTERNAL, UnitType::RUBY_TEXT_CONTAINER}},
440-	{"inline-block",{UnitType::DISPLAY_LEGACY, UnitType::INLINE_BLOCK}},
441-	{"inline-table",{UnitType::DISPLAY_LEGACY, UnitType::INLINE_TABLE}},
442-	{"inline-flex",{UnitType::DISPLAY_LEGACY, UnitType::INLINE_FLEX}},
443-	{"inline-grid",{UnitType::DISPLAY_LEGACY, UnitType::INLINE_GRID}},
444-	{"list-item",{UnitType::DISPLAY_LISTITEM, UnitType::LISTITEM}},
445-	{"block",{UnitType::DISPLAY_OUTSIDE, UnitType::BLOCK}},
446-	{"inline",{UnitType::DISPLAY_OUTSIDE, UnitType::INLINE}},
447-	{"run-in",{UnitType::DISPLAY_OUTSIDE, UnitType::RUN_IN}},
448-	{"linear",{UnitType::EASING_FUNCTION, UnitType::LINEAR}},
449-	{"ease",{UnitType::EASING_FUNCTION, UnitType::EASE}},
450-	{"ease-in",{UnitType::EASING_FUNCTION, UnitType::EASE_IN}},
451-	{"ease-out",{UnitType::EASING_FUNCTION, UnitType::EASE_OUT}},
452-	{"ease-in-out",{UnitType::EASING_FUNCTION, UnitType::EASE_IN_OUT}},
453-	{"step-start",{UnitType::EASING_FUNCTION, UnitType::STEP_START}},
454-	{"step-end",{UnitType::EASING_FUNCTION, UnitType::STEP_END}},
455-	{"jump-start",{UnitType::EASING_FUNCTION, UnitType::JUMP_START}},
456-	{"jump-end",{UnitType::EASING_FUNCTION, UnitType::JUMP_END}},
457-	{"jump-none",{UnitType::EASING_FUNCTION, UnitType::JUMP_NONE}},
458-	{"jump-both",{UnitType::EASING_FUNCTION, UnitType::JUMP_BOTH}},
459-	{"serif",{UnitType::GENERIC_FAMILY, UnitType::SERIF}},
460-	{"sans-serif",{UnitType::GENERIC_FAMILY, UnitType::SANS_SERIF}},
461-	{"monospace",{UnitType::GENERIC_FAMILY, UnitType::MONOSPACE}},
462-	{"cursive",{UnitType::GENERIC_FAMILY, UnitType::CURSIVE}},
463-	{"fantasy",{UnitType::GENERIC_FAMILY, UnitType::FANTASY}},
464-	{"system-ui",{UnitType::GENERIC_FAMILY, UnitType::SYSTEM_UI}},
465-	{"ui-serif",{UnitType::GENERIC_FAMILY, UnitType::UI_SERIF}},
466-	{"ui-sans-serif",{UnitType::GENERIC_FAMILY, UnitType::UI_SANS_SERIF}},
467-	{"ui-monospace",{UnitType::GENERIC_FAMILY, UnitType::UI_MONOSPACE}},
468-	{"ui-rounded",{UnitType::GENERIC_FAMILY, UnitType::UI_ROUNDED}},
469-	{"math",{UnitType::GENERIC_FAMILY, UnitType::MATH}},
470-	{"fangsong",{UnitType::GENERIC_FAMILY, UnitType::FANGSONG}},
471-	{"top",{UnitType::POSITION, UnitType::TOP}},
472-	{"left",{UnitType::POSITION, UnitType::LEFT}},
473-	{"bottom",{UnitType::POSITION, UnitType::BOTTOM}},
474-	{"right",{UnitType::POSITION, UnitType::RIGHT}},
475-	{"center",{UnitType::POSITION, UnitType::CENTER}},
476-	{"inline-start",{UnitType::POSITION, UnitType::INLINE_START}},
477-	{"inline-end",{UnitType::POSITION, UnitType::INLINE_END}},
478-	{"block-start",{UnitType::POSITION, UnitType::BLOCK_START}},
479-	{"block-end",{UnitType::POSITION, UnitType::BLOCK_END}},
480-	{"self-start",{UnitType::POSITION, UnitType::SELF_START}},
481-	{"self-end",{UnitType::POSITION, UnitType::SELF_END}},
482-	{"flex-start",{UnitType::POSITION, UnitType::FLEX_START}},
483-	{"flex-end",{UnitType::POSITION, UnitType::FLEX_END}},
484-	{"circle",{UnitType::SHAPE, UnitType::CIRCLE}},
485-	{"ellipse",{UnitType::SHAPE, UnitType::ELLIPSE}},
486-	{"shorter hue",{UnitType::HUE_INTERPOLATION, UnitType::SHORTER_HUE}},
487-	{"longer hue",{UnitType::HUE_INTERPOLATION, UnitType::LONGER_HUE}},
488-	{"increasing hue",{UnitType::HUE_INTERPOLATION, UnitType::INCREASING_HUE}},
489-	{"decreasing hue",{UnitType::HUE_INTERPOLATION, UnitType::DECREASING_HUE}},
490-	{"hidden",{UnitType::LINE_STYLE, UnitType::HIDDEN}},
491-	{"dotted",{UnitType::LINE_STYLE, UnitType::DOTTED}},
492-	{"dashed",{UnitType::LINE_STYLE, UnitType::DASHED}},
493-	{"solid",{UnitType::LINE_STYLE, UnitType::SOLID}},
494-	{"double",{UnitType::LINE_STYLE, UnitType::DOUBLE}},
495-	{"groove",{UnitType::LINE_STYLE, UnitType::GROOVE}},
496-	{"ridge",{UnitType::LINE_STYLE, UnitType::RIDGE}},
497-	{"inset",{UnitType::LINE_STYLE, UnitType::INSET}},
498-	{"outset",{UnitType::LINE_STYLE, UnitType::OUTSET}},
499-	{"baseline",{UnitType::BASELINE, UnitType::FIRST}},
500-	{"first baseline",{UnitType::BASELINE, UnitType::FIRST}},
501-	{"last baseline",{UnitType::BASELINE, UnitType::LAST}},
502-	{"safe",{UnitType::OVERFLOW_POSITION, UnitType::SAFE}},
503-	{"unsafe",{UnitType::OVERFLOW_POSITION, UnitType::UNSAFE}},
504-	{"visible",{UnitType::OVERFLOW, UnitType::VISIBLE}},
505-	{"clip",{UnitType::OVERFLOW, UnitType::CLIP}},
506-	{"scroll",{UnitType::OVERFLOW, UnitType::SCROLL}},
507-	{"auto",{UnitType::OVERFLOW, UnitType::AUTO}},
508+
509+static const std::unordered_map<std::string_view, UnitType> kMatch{
510+    {"+", UnitType::ADD},
511+    {"-", UnitType::SUB},
512+    {"*", UnitType::MULT},
513+    {"/", UnitType::DIV},
514+    {"==", UnitType::EQ},
515+    {">", UnitType::GT},
516+    {"<", UnitType::LT},
517+    {">=", UnitType::GE},
518+    {"<=", UnitType::LE},
519+    {"infinity", UnitType::INF},
520+    {"-infinity", UnitType::NEGINF},
521+    {"NaN", UnitType::NaN},
522+    {"e", UnitType::E},
523+    {"pi", UnitType::PI},
524+    {"content-box", UnitType::CONTENT},
525+    {"padding-box", UnitType::PADDING},
526+    {"border-box", UnitType::BORDER},
527+    {"margin-box", UnitType::MARGIN},
528+    {"fill-box", UnitType::FILL},
529+    {"stroke-box", UnitType::STROKE},
530+    {"view-box", UnitType::VIEW},
531+    {"space-between", UnitType::BETWEEN},
532+    {"space-around", UnitType::AROUND},
533+    {"space-evenly", UnitType::EVENLY},
534+    {"stretch", UnitType::STRETCH},
535+    {"normal", UnitType::NORMAL},
536+    {"contents", UnitType::CONTENTS},
537+    {"none", UnitType::NONE},
538+    {"flow", UnitType::FLOW},
539+    {"flow-root", UnitType::FLOW_ROOT},
540+    {"table", UnitType::TABLE},
541+    {"flex", UnitType::FLEX},
542+    {"grid", UnitType::GRID},
543+    {"ruby", UnitType::RUBY},
544+    {"table-row-group", UnitType::TABLE_ROW_GROUP},
545+    {"table-header-group", UnitType::TABLE_HEADER_GROUP},
546+    {"table-footer-group", UnitType::TABLE_FOOTER_GROUP},
547+    {"table-column-group", UnitType::TABLE_COLUMN_GROUP},
548+    {"table-row", UnitType::TABLE_ROW},
549+    {"table-cell", UnitType::TABLE_CELL},
550+    {"table-column", UnitType::TABLE_COLUMN},
551+    {"table-caption", UnitType::TABLE_CAPTION},
552+    {"ruby-base", UnitType::RUBY_BASE},
553+    {"ruby-text", UnitType::RUBY_TEXT},
554+    {"ruby-base-container", UnitType::RUBY_BASE_CONTAINER},
555+    {"ruby-text-container", UnitType::RUBY_TEXT_CONTAINER},
556+    {"inline-block", UnitType::INLINE_BLOCK},
557+    {"inline-table", UnitType::INLINE_TABLE},
558+    {"inline-flex", UnitType::INLINE_FLEX},
559+    {"inline-grid", UnitType::INLINE_GRID},
560+    {"list-item", UnitType::LISTITEM},
561+    {"block", UnitType::BLOCK},
562+    {"inline", UnitType::INLINE},
563+    {"run-in", UnitType::RUN_IN},
564+    {"linear", UnitType::LINEAR},
565+    {"ease", UnitType::EASE},
566+    {"ease-in", UnitType::EASE_IN},
567+    {"ease-out", UnitType::EASE_OUT},
568+    {"ease-in-out", UnitType::EASE_IN_OUT},
569+    {"step-start", UnitType::STEP_START},
570+    {"step-end", UnitType::STEP_END},
571+    {"jump-start", UnitType::JUMP_START},
572+    {"jump-end", UnitType::JUMP_END},
573+    {"jump-none", UnitType::JUMP_NONE},
574+    {"jump-both", UnitType::JUMP_BOTH},
575+    {"serif", UnitType::SERIF},
576+    {"sans-serif", UnitType::SANS_SERIF},
577+    {"monospace", UnitType::MONOSPACE},
578+    {"cursive", UnitType::CURSIVE},
579+    {"fantasy", UnitType::FANTASY},
580+    {"system-ui", UnitType::SYSTEM_UI},
581+    {"ui-serif", UnitType::UI_SERIF},
582+    {"ui-sans-serif", UnitType::UI_SANS_SERIF},
583+    {"ui-monospace", UnitType::UI_MONOSPACE},
584+    {"ui-rounded", UnitType::UI_ROUNDED},
585+    {"math", UnitType::MATH},
586+    {"fangsong", UnitType::FANGSONG},
587+    {"top", UnitType::TOP},
588+    {"left", UnitType::LEFT},
589+    {"bottom", UnitType::BOTTOM},
590+    {"right", UnitType::RIGHT},
591+    {"center", UnitType::CENTER},
592+    {"inline-start", UnitType::INLINE_START},
593+    {"inline-end", UnitType::INLINE_END},
594+    {"block-start", UnitType::BLOCK_START},
595+    {"block-end", UnitType::BLOCK_END},
596+    {"self-start", UnitType::SELF_START},
597+    {"self-end", UnitType::SELF_END},
598+    {"flex-start", UnitType::FLEX_START},
599+    {"flex-end", UnitType::FLEX_END},
600+    {"circle", UnitType::CIRCLE},
601+    {"ellipse", UnitType::ELLIPSE},
602+    {"shorter hue", UnitType::SHORTER_HUE},
603+    {"longer hue", UnitType::LONGER_HUE},
604+    {"increasing hue", UnitType::INCREASING_HUE},
605+    {"decreasing hue", UnitType::DECREASING_HUE},
606+    {"dotted", UnitType::DOTTED},
607+    {"dashed", UnitType::DASHED},
608+    {"solid", UnitType::SOLID},
609+    {"double", UnitType::DOUBLE},
610+    {"groove", UnitType::GROOVE},
611+    {"ridge", UnitType::RIDGE},
612+    {"inset", UnitType::INSET},
613+    {"outset", UnitType::OUTSET},
614+    {"baseline", UnitType::FIRST},
615+    {"first baseline", UnitType::FIRST},
616+    {"last baseline", UnitType::LAST},
617+    {"safe", UnitType::SAFE},
618+    {"unsafe", UnitType::UNSAFE},
619+    {"visible", UnitType::VISIBLE},
620+    {"clip", UnitType::CLIP},
621+    {"scroll", UnitType::SCROLL},
622+    {"inherit", UnitType::INHERIT},
623+    {"initial", UnitType::INITIAL},
624+    {"revert", UnitType::REVERT},
625+    {"revert-layer", UnitType::REVERT_LAYER},
626+    {"unset", UnitType::UNSET},
627 };
628 
629 /*
630@@ -708,6 +708,8 @@ static const std::unordered_map<std::string_view, std::pair<UnitType, UnitType>>
631 
632 		overflow: hidden
633 
634+		today work on fixing the double alloc and map with prop keys
635+
636 		what to do about strings
637 */
638 
639@@ -757,7 +759,6 @@ static const std::unordered_map<std::string_view, UnitType> kFunc{
640 	{"skewX", UnitType::SKEWX},
641 	{"skewY", UnitType::SKEWY},
642 	{"url", UnitType::URL},
643-
644 	{"", UnitType::GROUP}
645 };
646 
647@@ -766,7 +767,7 @@ static const std::unordered_map<std::string_view, float> kAbsSize{
648 	{"large",1.2f}, {"x-large",1.5f}, {"xx-large",2.0f}, {"xxx-large",3.0f}
649 };
650 
651-std::vector<Unit> getUnit(std::string value) {
652+std::vector<Unit> getUnit(std::string key, std::string value) {
653 	std::vector<Unit> units;
654 	
655 	std::string buffer = "";
656@@ -843,8 +844,8 @@ std::vector<Unit> getUnit(std::string value) {
657 				/*
658 					Keyword Matching
659 				*/
660-				unit.type = it->second.first;
661-				unit.value.ENUM = it->second.second;
662+				unit.type = it->second;
663+				// the value is not used here
664 				found = true;
665 			} else if (auto it = kColor.find(buffer); it != kColor.end()) { 
666 				/*
667@@ -1143,7 +1144,7 @@ void StyleHandler::parseStream(std::istream& inputStream) {
668 				if (key.length() > 2 && key[0] == '-' && key[1] == '-') {
669 					current->variables[key] = value;
670 				} else {
671-					current->properties[key] = value;
672+					current->properties[key] = getUnit(key,value); 
673 				}
674 			}
675 			buffer.clear();