@bookklik/senangstart-css 0.2.4 → 0.2.6

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.
Files changed (154) hide show
  1. package/.agent/skills/add-utility/scripts/scaffold-utility.js +209 -0
  2. package/.agent/skills/compiler-development/SKILL.md +272 -0
  3. package/.agent/skills/jit-engine/SKILL.md +241 -0
  4. package/.agent/skills/jit-engine/examples/add-visual-utility.js +117 -0
  5. package/.agent/skills/jit-engine/examples/scale-based-utilities.js +130 -0
  6. package/.agent/skills/jit-engine/examples/state-responsive-handling.js +177 -0
  7. package/.agent/skills/senangstart-architecture/SKILL.md +163 -0
  8. package/.agent/skills/tailwind-conversion/SKILL.md +264 -0
  9. package/.agent/workflows/add-utility.md +155 -0
  10. package/.agent/workflows/build.md +97 -0
  11. package/.agent/workflows/dev.md +58 -0
  12. package/.agent/workflows/docs.md +113 -0
  13. package/.agent/workflows/test.md +103 -0
  14. package/dist/senangstart-css.js +165 -20
  15. package/dist/senangstart-css.min.js +39 -26
  16. package/dist/senangstart-tw.js +262 -52
  17. package/dist/senangstart-tw.min.js +1 -1
  18. package/docs/.vitepress/config.js +10 -2
  19. package/docs/guide/cdn.md +1 -1
  20. package/docs/ms/guide/cdn.md +1 -1
  21. package/docs/ms/reference/layout/position.md +4 -4
  22. package/docs/ms/reference/layout/z-index.md +8 -8
  23. package/docs/ms/reference/space/gap.md +1 -1
  24. package/docs/ms/reference/space/height.md +42 -7
  25. package/docs/ms/reference/space/margin.md +1 -1
  26. package/docs/ms/reference/space/padding.md +1 -1
  27. package/docs/ms/reference/space/scale-reference.md +46 -17
  28. package/docs/ms/reference/space/width.md +40 -5
  29. package/docs/ms/reference/space.md +1 -1
  30. package/docs/ms/reference/spacing.md +103 -21
  31. package/docs/ms/reference/visual/animation-fill.md +8 -8
  32. package/docs/ms/reference/visual/backdrop-blur.md +4 -4
  33. package/docs/ms/reference/visual/backdrop-brightness.md +8 -8
  34. package/docs/ms/reference/visual/backdrop-grayscale.md +6 -6
  35. package/docs/ms/reference/visual/backdrop-sepia.md +6 -6
  36. package/docs/ms/reference/visual/background-clip.md +2 -2
  37. package/docs/ms/reference/visual/background-image.md +4 -4
  38. package/docs/ms/reference/visual/divide-reverse.md +66 -0
  39. package/docs/ms/reference/visual/divide-style.md +80 -0
  40. package/docs/ms/reference/visual/divide-width.md +89 -0
  41. package/docs/ms/reference/visual/divide.md +115 -0
  42. package/docs/ms/reference/visual/filter-brightness.md +4 -4
  43. package/docs/ms/reference/visual/filter-contrast.md +4 -4
  44. package/docs/ms/reference/visual/filter-drop-shadow.md +6 -6
  45. package/docs/ms/reference/visual/filter-grayscale.md +4 -4
  46. package/docs/ms/reference/visual/filter-hue-rotate.md +4 -4
  47. package/docs/ms/reference/visual/filter-invert.md +2 -2
  48. package/docs/ms/reference/visual/filter-saturate.md +4 -4
  49. package/docs/ms/reference/visual/filter-sepia.md +4 -4
  50. package/docs/ms/reference/visual/font-family.md +2 -2
  51. package/docs/ms/reference/visual/gradient-from.md +57 -57
  52. package/docs/ms/reference/visual/gradient-to.md +57 -57
  53. package/docs/ms/reference/visual/gradient-via.md +54 -54
  54. package/docs/ms/reference/visual/letter-spacing.md +2 -2
  55. package/docs/ms/reference/visual/line-clamp.md +2 -2
  56. package/docs/ms/reference/visual/line-height.md +2 -2
  57. package/docs/ms/reference/visual/outline.md +2 -2
  58. package/docs/ms/reference/visual/ring-color.md +29 -0
  59. package/docs/ms/reference/visual/ring-offset.md +30 -0
  60. package/docs/ms/reference/visual/ring.md +62 -0
  61. package/docs/ms/reference/visual/stroke-width.md +6 -6
  62. package/docs/ms/reference/visual/stroke.md +4 -4
  63. package/docs/ms/reference/visual/text-indent.md +2 -2
  64. package/docs/ms/reference/visual/text-overflow.md +2 -2
  65. package/docs/ms/reference/visual/text-size.md +2 -2
  66. package/docs/ms/reference/visual/text-wrap.md +2 -2
  67. package/docs/ms/reference/visual/transform-backface.md +4 -4
  68. package/docs/ms/reference/visual/transform-perspective-origin.md +6 -6
  69. package/docs/ms/reference/visual/transform-perspective.md +6 -6
  70. package/docs/ms/reference/visual/transform-rotate-3d.md +6 -6
  71. package/docs/ms/reference/visual/transform-style.md +4 -4
  72. package/docs/ms/reference/visual/transform-translate-z.md +6 -6
  73. package/docs/ms/reference/visual/transform-translate.md +2 -2
  74. package/docs/ms/reference/visual/whitespace.md +2 -2
  75. package/docs/ms/reference/visual/word-break.md +2 -2
  76. package/docs/public/assets/senangstart-css.min.js +39 -26
  77. package/docs/public/llms.txt +1756 -0
  78. package/docs/reference/layout/position.md +4 -4
  79. package/docs/reference/layout/z-index.md +8 -8
  80. package/docs/reference/space/gap.md +1 -1
  81. package/docs/reference/space/height.md +42 -7
  82. package/docs/reference/space/margin.md +1 -1
  83. package/docs/reference/space/padding.md +1 -1
  84. package/docs/reference/space/scale-reference.md +46 -17
  85. package/docs/reference/space/width.md +40 -5
  86. package/docs/reference/space.md +1 -1
  87. package/docs/reference/spacing.md +103 -21
  88. package/docs/reference/visual/animation-fill.md +8 -8
  89. package/docs/reference/visual/backdrop-blur.md +4 -4
  90. package/docs/reference/visual/backdrop-brightness.md +8 -8
  91. package/docs/reference/visual/backdrop-grayscale.md +6 -6
  92. package/docs/reference/visual/backdrop-sepia.md +6 -6
  93. package/docs/reference/visual/background-clip.md +2 -2
  94. package/docs/reference/visual/background-image.md +4 -4
  95. package/docs/reference/visual/divide-reverse.md +66 -0
  96. package/docs/reference/visual/divide-style.md +80 -0
  97. package/docs/reference/visual/divide-width.md +89 -0
  98. package/docs/reference/visual/divide.md +115 -0
  99. package/docs/reference/visual/filter-brightness.md +4 -4
  100. package/docs/reference/visual/filter-contrast.md +4 -4
  101. package/docs/reference/visual/filter-drop-shadow.md +6 -6
  102. package/docs/reference/visual/filter-grayscale.md +4 -4
  103. package/docs/reference/visual/filter-hue-rotate.md +4 -4
  104. package/docs/reference/visual/filter-invert.md +2 -2
  105. package/docs/reference/visual/filter-saturate.md +4 -4
  106. package/docs/reference/visual/filter-sepia.md +4 -4
  107. package/docs/reference/visual/font-family.md +2 -2
  108. package/docs/reference/visual/gradient-from.md +57 -57
  109. package/docs/reference/visual/gradient-to.md +57 -57
  110. package/docs/reference/visual/gradient-via.md +54 -54
  111. package/docs/reference/visual/letter-spacing.md +2 -2
  112. package/docs/reference/visual/line-clamp.md +2 -2
  113. package/docs/reference/visual/line-height.md +2 -2
  114. package/docs/reference/visual/outline.md +2 -2
  115. package/docs/reference/visual/ring-color.md +29 -0
  116. package/docs/reference/visual/ring-offset.md +30 -0
  117. package/docs/reference/visual/ring.md +62 -0
  118. package/docs/reference/visual/stroke-width.md +6 -6
  119. package/docs/reference/visual/stroke.md +4 -4
  120. package/docs/reference/visual/text-indent.md +2 -2
  121. package/docs/reference/visual/text-overflow.md +2 -2
  122. package/docs/reference/visual/text-size.md +2 -2
  123. package/docs/reference/visual/text-wrap.md +2 -2
  124. package/docs/reference/visual/transform-backface.md +4 -4
  125. package/docs/reference/visual/transform-perspective-origin.md +6 -6
  126. package/docs/reference/visual/transform-perspective.md +6 -6
  127. package/docs/reference/visual/transform-rotate-3d.md +6 -6
  128. package/docs/reference/visual/transform-style.md +4 -4
  129. package/docs/reference/visual/transform-translate-z.md +6 -6
  130. package/docs/reference/visual/transform-translate.md +2 -2
  131. package/docs/reference/visual/whitespace.md +2 -2
  132. package/docs/reference/visual/word-break.md +2 -2
  133. package/docs/reference/visual.md +8 -2
  134. package/package.json +4 -2
  135. package/scripts/build-dist.js +2 -2
  136. package/scripts/bundle-jit.js +3 -3
  137. package/scripts/convert-tailwind.js +250 -2
  138. package/scripts/generate-llms-txt.js +264 -0
  139. package/src/cdn/{jit.js → senangstart-engine.js} +184 -38
  140. package/src/cdn/tw-conversion-engine.js +282 -68
  141. package/src/compiler/generators/css.js +115 -2
  142. package/src/config/defaults.js +37 -11
  143. package/src/core/constants.js +37 -8
  144. package/src/definitions/index.js +3 -0
  145. package/src/definitions/space.js +97 -20
  146. package/src/definitions/visual-borders.js +80 -1
  147. package/src/definitions/visual-divide.js +225 -0
  148. package/src/definitions/visual-transform3d.js +16 -16
  149. package/src/definitions/visual-transforms.js +1 -1
  150. package/src/definitions/visual-transitions.js +4 -4
  151. package/src/definitions/visual-typography.js +6 -6
  152. package/src/definitions/visual.js +4 -4
  153. package/tests/unit/compiler/generators/css.test.js +267 -3
  154. package/tests/unit/convert-tailwind.test.js +59 -1
@@ -0,0 +1,103 @@
1
+ ---
2
+ description: Run tests including unit, integration, sync, and coverage reports
3
+ ---
4
+
5
+ // turbo-all
6
+
7
+ # Testing Workflow
8
+
9
+ ## Run All Tests
10
+
11
+ // turbo
12
+ 1. Execute the full test suite:
13
+ ```bash
14
+ npm test
15
+ ```
16
+
17
+ ## Unit Tests Only
18
+
19
+ // turbo
20
+ 1. Run unit tests:
21
+ ```bash
22
+ npm run test:unit
23
+ ```
24
+
25
+ Unit tests cover:
26
+ - `tests/unit/compiler/` - CSS generators and parser tests
27
+ - `tests/unit/config/` - Configuration loading tests
28
+ - `tests/unit/convert-tailwind.test.js` - TW conversion tests
29
+ - `tests/unit/security.test.js` - Security validation tests
30
+
31
+ ## Integration Tests
32
+
33
+ // turbo
34
+ 1. Run integration tests:
35
+ ```bash
36
+ npm run test:integration
37
+ ```
38
+
39
+ Integration tests in `tests/integration/` verify end-to-end compilation.
40
+
41
+ ## Sync Tests
42
+
43
+ // turbo
44
+ 1. Run sync tests:
45
+ ```bash
46
+ npm run test:sync
47
+ ```
48
+
49
+ Sync tests in `tests/sync/` verify definition-to-engine parity.
50
+
51
+ ## Watch Mode
52
+
53
+ // turbo
54
+ 1. Run tests in watch mode for TDD:
55
+ ```bash
56
+ npm run test:watch
57
+ ```
58
+
59
+ ## Coverage Report
60
+
61
+ 1. Generate test coverage report:
62
+ ```bash
63
+ npm run test:coverage
64
+ ```
65
+
66
+ This creates:
67
+ - Console text report
68
+ - HTML report in `coverage/` directory
69
+
70
+ ## Test File Structure
71
+
72
+ ```
73
+ tests/
74
+ ├── helpers/ # Test utilities
75
+ ├── integration/ # End-to-end tests
76
+ ├── sync/ # Definition sync tests
77
+ └── unit/
78
+ ├── compiler/
79
+ │ ├── generators/
80
+ │ │ ├── 3d-transforms.test.js
81
+ │ │ ├── css.test.js
82
+ │ │ └── html.test.js
83
+ │ └── parser.test.js
84
+ ├── config/
85
+ │ └── config.test.js
86
+ ├── convert-tailwind.test.js
87
+ └── security.test.js
88
+ ```
89
+
90
+ ## Writing New Tests
91
+
92
+ 1. Create test file in appropriate `tests/` subdirectory
93
+ 2. Use Node.js built-in test runner:
94
+ ```javascript
95
+ import { test, describe } from 'node:test';
96
+ import assert from 'node:assert';
97
+
98
+ describe('MyFeature', () => {
99
+ test('should do something', () => {
100
+ assert.strictEqual(actual, expected);
101
+ });
102
+ });
103
+ ```
@@ -2,7 +2,7 @@
2
2
  (() => {
3
3
  // src/core/constants.js
4
4
  var BREAKPOINTS = ["mob", "tab", "lap", "desk", "tw-sm", "tw-md", "tw-lg", "tw-xl", "tw-2xl"];
5
- var STATES = ["hover", "focus", "active", "disabled", "dark"];
5
+ var STATES = ["hover", "focus", "focus-visible", "active", "disabled", "dark"];
6
6
  var LAYOUT_KEYWORDS = [
7
7
  "flex",
8
8
  "grid",
@@ -171,22 +171,54 @@
171
171
  return token;
172
172
  }
173
173
 
174
- // src/cdn/jit.js
174
+ // src/cdn/senangstart-engine.js
175
175
  (function() {
176
176
  "use strict";
177
177
  const defaultConfig = {
178
178
  theme: {
179
179
  spacing: {
180
180
  "none": "0px",
181
+ // No space
181
182
  "thin": "1px",
183
+ // Hairline (for borders)
182
184
  "regular": "2px",
185
+ // Standard border
183
186
  "thick": "3px",
187
+ // Bold border
184
188
  "tiny": "4px",
189
+ // Small offsets
190
+ "tiny-2x": "6px",
191
+ // Tiny multiplied
185
192
  "small": "8px",
193
+ "small-2x": "10px",
194
+ "small-3x": "12px",
195
+ "small-4x": "14px",
186
196
  "medium": "16px",
187
- "big": "32px",
188
- "giant": "64px",
189
- "vast": "128px"
197
+ "medium-2x": "20px",
198
+ "medium-3x": "24px",
199
+ "medium-4x": "28px",
200
+ "large": "32px",
201
+ "large-2x": "36px",
202
+ "large-3x": "40px",
203
+ "large-4x": "44px",
204
+ "big": "48px",
205
+ "big-2x": "56px",
206
+ "big-3x": "64px",
207
+ "big-4x": "80px",
208
+ "giant": "96px",
209
+ "giant-2x": "112px",
210
+ "giant-3x": "128px",
211
+ "giant-4x": "144px",
212
+ "vast": "160px",
213
+ "vast-2x": "176px",
214
+ "vast-3x": "192px",
215
+ "vast-4x": "208px",
216
+ "vast-5x": "224px",
217
+ "vast-6x": "240px",
218
+ "vast-7x": "256px",
219
+ "vast-8x": "288px",
220
+ "vast-9x": "320px",
221
+ "vast-10x": "384px"
190
222
  },
191
223
  radius: {
192
224
  "none": "0px",
@@ -559,6 +591,15 @@
559
591
  "mid": "50",
560
592
  "high": "100",
561
593
  "top": "9999"
594
+ },
595
+ ring: {
596
+ "none": "0px",
597
+ "thin": "1px",
598
+ "regular": "2px",
599
+ "thick": "3px",
600
+ "small": "4px",
601
+ "medium": "6px",
602
+ "big": "8px"
562
603
  }
563
604
  },
564
605
  // Dark mode configuration
@@ -581,7 +622,8 @@
581
622
  fontWeight: { type: "object" },
582
623
  screens: { type: "object" },
583
624
  colors: { type: "object" },
584
- zIndex: { type: "object" }
625
+ zIndex: { type: "object" },
626
+ ring: { type: "object" }
585
627
  }
586
628
  },
587
629
  darkMode: { type: "string", enum: ["media", "selector"] },
@@ -675,6 +717,18 @@
675
717
  css += ` --z-${key}: ${value};
676
718
  `;
677
719
  }
720
+ if (theme.ring) {
721
+ for (const [key, value] of Object.entries(theme.ring)) {
722
+ css += ` --ring-${key}: ${value};
723
+ `;
724
+ }
725
+ }
726
+ css += ` --ring-color: var(--c-primary);
727
+ `;
728
+ css += ` --ring-offset: 0px;
729
+ `;
730
+ css += ` --ring-offset-color: #fff;
731
+ `;
678
732
  const twSpacing = {
679
733
  "0": "0px",
680
734
  "px": "1px",
@@ -1306,6 +1360,24 @@ img, video {
1306
1360
  };
1307
1361
  return autoMap[property] || "";
1308
1362
  }
1363
+ const sizingSpecialValues = {
1364
+ "min": "min-content",
1365
+ "max": "max-content",
1366
+ "fit": "fit-content"
1367
+ };
1368
+ const sizingProps = ["w", "h", "min-w", "max-w", "min-h", "max-h"];
1369
+ if (sizingProps.includes(property) && sizingSpecialValues[value]) {
1370
+ const cssValue2 = sizingSpecialValues[value];
1371
+ const propMap = {
1372
+ "w": `width: ${cssValue2};`,
1373
+ "h": `height: ${cssValue2};`,
1374
+ "min-w": `min-width: ${cssValue2};`,
1375
+ "max-w": `max-width: ${cssValue2};`,
1376
+ "min-h": `min-height: ${cssValue2};`,
1377
+ "max-h": `max-height: ${cssValue2};`
1378
+ };
1379
+ return propMap[property] || "";
1380
+ }
1309
1381
  let cssValue;
1310
1382
  if (isArbitrary) {
1311
1383
  cssValue = value;
@@ -2102,6 +2174,80 @@ img, video {
2102
2174
  return `outline-offset: ${cssValue};`;
2103
2175
  },
2104
2176
  // ============================================
2177
+ // RING UTILITIES (Focus Ring)
2178
+ // ============================================
2179
+ "ring": () => {
2180
+ if (value === "none") {
2181
+ return `box-shadow: 0 0 0 0 transparent;`;
2182
+ }
2183
+ const cssValue = isArbitrary ? value : `var(--ring-${value})`;
2184
+ return `box-shadow: 0 0 0 var(--ring-offset) var(--ring-offset-color), 0 0 0 calc(${cssValue} + var(--ring-offset)) var(--ring-color);`;
2185
+ },
2186
+ "ring-color": () => {
2187
+ const cssValue = isArbitrary ? value : `var(--c-${value})`;
2188
+ return `--ring-color: ${cssValue};`;
2189
+ },
2190
+ "ring-offset": () => {
2191
+ const cssValue = isArbitrary ? value : `${value}px`;
2192
+ return `--ring-offset: ${cssValue};`;
2193
+ },
2194
+ "ring-offset-color": () => {
2195
+ const cssValue = isArbitrary ? value : `var(--c-${value})`;
2196
+ return `--ring-offset-color ${cssValue};`;
2197
+ },
2198
+ // ============================================
2199
+ // DIVIDE UTILITIES
2200
+ // ============================================
2201
+ "divide": () => {
2202
+ const cssValue = isArbitrary ? value : `var(--c-${value})`;
2203
+ return `border-color: ${cssValue}; border-style: solid;`;
2204
+ },
2205
+ "divide-x": () => {
2206
+ if (value === "reverse") {
2207
+ return "--ss-divide-x-reverse: 1;";
2208
+ }
2209
+ const cssValue = isArbitrary ? value : `var(--c-${value})`;
2210
+ return `border-left-color: ${cssValue}; border-right-color: ${cssValue}; border-left-style: solid; border-right-style: solid;`;
2211
+ },
2212
+ "divide-y": () => {
2213
+ if (value === "reverse") {
2214
+ return "--ss-divide-y-reverse: 1;";
2215
+ }
2216
+ const cssValue = isArbitrary ? value : `var(--c-${value})`;
2217
+ return `border-top-color: ${cssValue}; border-bottom-color: ${cssValue}; border-top-style: solid; border-bottom-style: solid;`;
2218
+ },
2219
+ "divide-w": () => {
2220
+ const cssValue = isArbitrary ? value : `var(--s-${value})`;
2221
+ return `border-width: ${cssValue}; border-style: solid;`;
2222
+ },
2223
+ "divide-x-w": () => {
2224
+ const cssValue = isArbitrary ? value : `var(--s-${value})`;
2225
+ return `
2226
+ border-right-width: calc(${cssValue} * var(--ss-divide-x-reverse, 0));
2227
+ border-left-width: calc(${cssValue} * (1 - var(--ss-divide-x-reverse, 0)));
2228
+ border-left-style: solid;
2229
+ border-right-style: solid;
2230
+ `;
2231
+ },
2232
+ "divide-y-w": () => {
2233
+ const cssValue = isArbitrary ? value : `var(--s-${value})`;
2234
+ return `
2235
+ border-bottom-width: calc(${cssValue} * var(--ss-divide-y-reverse, 0));
2236
+ border-top-width: calc(${cssValue} * (1 - var(--ss-divide-y-reverse, 0)));
2237
+ border-top-style: solid;
2238
+ border-bottom-style: solid;
2239
+ `;
2240
+ },
2241
+ "divide-x:reverse": () => {
2242
+ return "--ss-divide-x-reverse: 1;";
2243
+ },
2244
+ "divide-y:reverse": () => {
2245
+ return "--ss-divide-y-reverse: 1;";
2246
+ },
2247
+ "divide-style": () => {
2248
+ return `border-style: ${value};`;
2249
+ },
2250
+ // ============================================
2105
2251
  // SVG UTILITIES
2106
2252
  // ============================================
2107
2253
  "stroke": () => {
@@ -2194,23 +2340,22 @@ img, video {
2194
2340
  break;
2195
2341
  }
2196
2342
  if (!cssDeclaration) return "";
2197
- let selector = `[${attrType}~="${raw}"]`;
2198
- if (token.state && token.state !== "dark") {
2199
- selector += `:${token.state}`;
2200
- }
2201
- let rule = `${selector} { ${cssDeclaration} }
2202
- `;
2203
- if (token.state === "dark") {
2204
- rule = `:where(.dark) ${rule}`;
2343
+ const isDivide = raw.startsWith("divide") && !raw.includes(":reverse");
2344
+ let selector = "";
2345
+ if (isDivide) {
2346
+ selector = `[visual~="${raw}"] > :not([hidden]) ~ :not([hidden])`;
2347
+ } else {
2348
+ selector = `[${attrType}~="${raw}"]`;
2205
2349
  }
2206
- if (token.breakpoint) {
2207
- const screenWidth = defaultConfig.theme.screens[token.breakpoint];
2208
- if (screenWidth) {
2209
- return `@media (min-width: ${screenWidth}) { ${rule} }
2210
- `;
2350
+ if (token.state && token.state !== "dark") {
2351
+ if (isDivide) {
2352
+ selector = `[visual~="${raw}"] > :not([hidden]) ~ :not([hidden]):${token.state}`;
2353
+ } else {
2354
+ selector += `:${token.state}`;
2211
2355
  }
2212
2356
  }
2213
- return rule;
2357
+ return `${selector} { ${cssDeclaration} }
2358
+ `;
2214
2359
  }
2215
2360
  function scanDOM() {
2216
2361
  const tokens = {