@bookklik/senangstart-css 0.1.1 → 0.1.2

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 (137) hide show
  1. package/.github/workflows/deploy-docs.yml +55 -0
  2. package/dist/senangstart-css.js +503 -0
  3. package/dist/senangstart-css.min.js +375 -0
  4. package/docs/.vitepress/cache/deps/_metadata.json +52 -0
  5. package/docs/.vitepress/cache/deps/chunk-2CLQ7TTZ.js +9719 -0
  6. package/docs/.vitepress/cache/deps/chunk-2CLQ7TTZ.js.map +7 -0
  7. package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js +12824 -0
  8. package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js.map +7 -0
  9. package/docs/.vitepress/cache/deps/package.json +3 -0
  10. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +4505 -0
  11. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +7 -0
  12. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +583 -0
  13. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +7 -0
  14. package/docs/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js +1333 -0
  15. package/docs/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js.map +7 -0
  16. package/docs/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js +1665 -0
  17. package/docs/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js.map +7 -0
  18. package/docs/.vitepress/cache/deps/vitepress___minisearch.js +1813 -0
  19. package/docs/.vitepress/cache/deps/vitepress___minisearch.js.map +7 -0
  20. package/docs/.vitepress/cache/deps/vue.js +347 -0
  21. package/docs/.vitepress/cache/deps/vue.js.map +7 -0
  22. package/docs/.vitepress/config.js +108 -0
  23. package/docs/.vitepress/dist/404.html +22 -0
  24. package/docs/.vitepress/dist/assets/app.BTYj1wZj.js +1 -0
  25. package/docs/.vitepress/dist/assets/chunks/@localSearchIndexroot.DmMP4oUp.js +1 -0
  26. package/docs/.vitepress/dist/assets/chunks/VPLocalSearchBox.jxQ0k_uL.js +9 -0
  27. package/docs/.vitepress/dist/assets/chunks/framework.qISVh_QZ.js +19 -0
  28. package/docs/.vitepress/dist/assets/chunks/theme.B9Wtbwgj.js +2 -0
  29. package/docs/.vitepress/dist/assets/examples_cards.md.D4i0phvj.js +84 -0
  30. package/docs/.vitepress/dist/assets/examples_cards.md.D4i0phvj.lean.js +1 -0
  31. package/docs/.vitepress/dist/assets/examples_forms.md.BnsjqHST.js +169 -0
  32. package/docs/.vitepress/dist/assets/examples_forms.md.BnsjqHST.lean.js +1 -0
  33. package/docs/.vitepress/dist/assets/examples_hero.md.CCcb2x8Y.js +118 -0
  34. package/docs/.vitepress/dist/assets/examples_hero.md.CCcb2x8Y.lean.js +1 -0
  35. package/docs/.vitepress/dist/assets/examples_index.md.CcyXbirn.js +52 -0
  36. package/docs/.vitepress/dist/assets/examples_index.md.CcyXbirn.lean.js +1 -0
  37. package/docs/.vitepress/dist/assets/examples_navigation.md.CppyHbnP.js +106 -0
  38. package/docs/.vitepress/dist/assets/examples_navigation.md.CppyHbnP.lean.js +1 -0
  39. package/docs/.vitepress/dist/assets/guide_cdn.md.CANCjnm5.js +30 -0
  40. package/docs/.vitepress/dist/assets/guide_cdn.md.CANCjnm5.lean.js +1 -0
  41. package/docs/.vitepress/dist/assets/guide_cli.md.zXEKk-bu.js +44 -0
  42. package/docs/.vitepress/dist/assets/guide_cli.md.zXEKk-bu.lean.js +1 -0
  43. package/docs/.vitepress/dist/assets/guide_configuration.md.D2JZzhKm.js +79 -0
  44. package/docs/.vitepress/dist/assets/guide_configuration.md.D2JZzhKm.lean.js +1 -0
  45. package/docs/.vitepress/dist/assets/guide_getting-started.md.tO7bvmZd.js +47 -0
  46. package/docs/.vitepress/dist/assets/guide_getting-started.md.tO7bvmZd.lean.js +1 -0
  47. package/docs/.vitepress/dist/assets/guide_index.md.C1xk2lBl.js +3 -0
  48. package/docs/.vitepress/dist/assets/guide_index.md.C1xk2lBl.lean.js +1 -0
  49. package/docs/.vitepress/dist/assets/guide_natural-scale.md.D1oVRN5V.js +22 -0
  50. package/docs/.vitepress/dist/assets/guide_natural-scale.md.D1oVRN5V.lean.js +1 -0
  51. package/docs/.vitepress/dist/assets/guide_philosophy.md.DPyyMH8d.js +7 -0
  52. package/docs/.vitepress/dist/assets/guide_philosophy.md.DPyyMH8d.lean.js +1 -0
  53. package/docs/.vitepress/dist/assets/guide_responsive.md.wksOAMT5.js +57 -0
  54. package/docs/.vitepress/dist/assets/guide_responsive.md.wksOAMT5.lean.js +1 -0
  55. package/docs/.vitepress/dist/assets/guide_states.md.DRjYOZDJ.js +77 -0
  56. package/docs/.vitepress/dist/assets/guide_states.md.DRjYOZDJ.lean.js +1 -0
  57. package/docs/.vitepress/dist/assets/guide_tri-attribute.md.CoFqfmPZ.js +45 -0
  58. package/docs/.vitepress/dist/assets/guide_tri-attribute.md.CoFqfmPZ.lean.js +1 -0
  59. package/docs/.vitepress/dist/assets/index.md.CUZJzNzP.js +7 -0
  60. package/docs/.vitepress/dist/assets/index.md.CUZJzNzP.lean.js +1 -0
  61. package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  62. package/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  63. package/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  64. package/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  65. package/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  66. package/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  67. package/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  68. package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  69. package/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  70. package/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  71. package/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  72. package/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  73. package/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  74. package/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  75. package/docs/.vitepress/dist/assets/reference_breakpoints.md.BEhuwXBS.js +48 -0
  76. package/docs/.vitepress/dist/assets/reference_breakpoints.md.BEhuwXBS.lean.js +1 -0
  77. package/docs/.vitepress/dist/assets/reference_colors.md.Do4abjs1.js +29 -0
  78. package/docs/.vitepress/dist/assets/reference_colors.md.Do4abjs1.lean.js +1 -0
  79. package/docs/.vitepress/dist/assets/reference_layout.md.DqSoofMZ.js +13 -0
  80. package/docs/.vitepress/dist/assets/reference_layout.md.DqSoofMZ.lean.js +1 -0
  81. package/docs/.vitepress/dist/assets/reference_space.md.luOYAfQg.js +24 -0
  82. package/docs/.vitepress/dist/assets/reference_space.md.luOYAfQg.lean.js +1 -0
  83. package/docs/.vitepress/dist/assets/reference_spacing.md.DdsDhDhS.js +32 -0
  84. package/docs/.vitepress/dist/assets/reference_spacing.md.DdsDhDhS.lean.js +1 -0
  85. package/docs/.vitepress/dist/assets/reference_visual.md.DZFvxgPk.js +22 -0
  86. package/docs/.vitepress/dist/assets/reference_visual.md.DZFvxgPk.lean.js +1 -0
  87. package/docs/.vitepress/dist/assets/style.BuMqNgkb.css +1 -0
  88. package/docs/.vitepress/dist/examples/cards.html +108 -0
  89. package/docs/.vitepress/dist/examples/forms.html +193 -0
  90. package/docs/.vitepress/dist/examples/hero.html +142 -0
  91. package/docs/.vitepress/dist/examples/index.html +76 -0
  92. package/docs/.vitepress/dist/examples/navigation.html +130 -0
  93. package/docs/.vitepress/dist/guide/cdn.html +54 -0
  94. package/docs/.vitepress/dist/guide/cli.html +68 -0
  95. package/docs/.vitepress/dist/guide/configuration.html +103 -0
  96. package/docs/.vitepress/dist/guide/getting-started.html +71 -0
  97. package/docs/.vitepress/dist/guide/index.html +27 -0
  98. package/docs/.vitepress/dist/guide/natural-scale.html +46 -0
  99. package/docs/.vitepress/dist/guide/philosophy.html +31 -0
  100. package/docs/.vitepress/dist/guide/responsive.html +81 -0
  101. package/docs/.vitepress/dist/guide/states.html +101 -0
  102. package/docs/.vitepress/dist/guide/tri-attribute.html +69 -0
  103. package/docs/.vitepress/dist/hashmap.json +1 -0
  104. package/docs/.vitepress/dist/index.html +31 -0
  105. package/docs/.vitepress/dist/reference/breakpoints.html +72 -0
  106. package/docs/.vitepress/dist/reference/colors.html +53 -0
  107. package/docs/.vitepress/dist/reference/layout.html +37 -0
  108. package/docs/.vitepress/dist/reference/space.html +48 -0
  109. package/docs/.vitepress/dist/reference/spacing.html +56 -0
  110. package/docs/.vitepress/dist/reference/visual.html +46 -0
  111. package/docs/.vitepress/dist/vp-icons.css +1 -0
  112. package/docs/.vitepress/theme/custom.css +65 -0
  113. package/docs/.vitepress/theme/index.js +4 -0
  114. package/docs/examples/cards.md +116 -0
  115. package/docs/examples/forms.md +207 -0
  116. package/docs/examples/hero.md +150 -0
  117. package/docs/examples/index.md +87 -0
  118. package/docs/examples/navigation.md +144 -0
  119. package/docs/guide/cdn.md +110 -0
  120. package/docs/guide/cli.md +174 -0
  121. package/docs/guide/configuration.md +152 -0
  122. package/docs/guide/getting-started.md +130 -0
  123. package/docs/guide/index.md +64 -0
  124. package/docs/guide/natural-scale.md +123 -0
  125. package/docs/guide/philosophy.md +103 -0
  126. package/docs/guide/responsive.md +129 -0
  127. package/docs/guide/states.md +162 -0
  128. package/docs/guide/tri-attribute.md +187 -0
  129. package/docs/index.md +64 -0
  130. package/docs/reference/breakpoints.md +131 -0
  131. package/docs/reference/colors.md +106 -0
  132. package/docs/reference/layout.md +115 -0
  133. package/docs/reference/space.md +121 -0
  134. package/docs/reference/spacing.md +74 -0
  135. package/docs/reference/visual.md +160 -0
  136. package/package.json +7 -13
  137. package/scripts/build-dist.js +49 -0
@@ -0,0 +1,123 @@
1
+ # The Natural Scale
2
+
3
+ SenangStart uses natural adjectives that map to physical objects you can visualize.
4
+
5
+ ## The Philosophy
6
+
7
+ Instead of arbitrary numbers, think of **physical objects**:
8
+
9
+ | Keyword | Size | Mental Model |
10
+ |---------|------|--------------|
11
+ | `none` | 0px | No space |
12
+ | `tiny` | 4px | 🪨 **Pebble** — Borders, small offsets |
13
+ | `small` | 8px | 📦 **Matchbox** — Group related items |
14
+ | `medium` | 16px | 📱 **Smartphone** — Standard default |
15
+ | `big` | 32px | 💻 **Laptop** — Separate sections |
16
+ | `giant` | 64px | 🚪 **Door** — Layout divisions |
17
+ | `vast` | 128px | 🏠 **House** — Hero sections |
18
+
19
+ ## Using the Scale
20
+
21
+ ### When to use each size
22
+
23
+ **`tiny` (4px)** — For subtle details
24
+ - Icon spacing within buttons
25
+ - Border widths
26
+ - Small visual offsets
27
+
28
+ ```html
29
+ <button space="p-x:small p-y:tiny">
30
+ <icon /> Button
31
+ </button>
32
+ ```
33
+
34
+ **`small` (8px)** — For grouping related items
35
+ - Gap between label and input
36
+ - Spacing between avatar and name
37
+ - Tight list items
38
+
39
+ ```html
40
+ <div layout="flex col" space="g:small">
41
+ <label>Email</label>
42
+ <input type="email" />
43
+ </div>
44
+ ```
45
+
46
+ **`medium` (16px)** — The standard default
47
+ - Card padding
48
+ - Form field margins
49
+ - Standard component spacing
50
+
51
+ ```html
52
+ <div space="p:medium">
53
+ Standard card content
54
+ </div>
55
+ ```
56
+
57
+ **`big` (32px)** — For separating distinct sections
58
+ - Between header and content
59
+ - Between form groups
60
+ - Between major UI blocks
61
+
62
+ ```html
63
+ <header space="m-b:big">Page Title</header>
64
+ <main>Content separated from header</main>
65
+ ```
66
+
67
+ **`giant` (64px)** — For layout divisions
68
+ - Between page sections
69
+ - Major structural breaks
70
+ - Desktop navigation padding
71
+
72
+ ```html
73
+ <section space="p-y:giant">
74
+ Major page section
75
+ </section>
76
+ ```
77
+
78
+ **`vast` (128px)** — For hero sections and major spacing
79
+ - Hero section padding
80
+ - Large decorative spacing
81
+ - Full-bleed sections
82
+
83
+ ```html
84
+ <section space="p:vast" visual="bg:dark">
85
+ <h1>Welcome to the App</h1>
86
+ </section>
87
+ ```
88
+
89
+ ## Natural Language Mapping
90
+
91
+ When talking about spacing adjustments, use natural language:
92
+
93
+ | You say... | Action |
94
+ |------------|--------|
95
+ | "tighten it up" | Scale DOWN (medium → small → tiny) |
96
+ | "compact" | Use small or tiny |
97
+ | "give it air" | Scale UP (medium → big → giant) |
98
+ | "breathe" | Increase spacing |
99
+ | "spacious" | Use big or giant |
100
+ | "cramped" | Too much tiny/small, increase scale |
101
+
102
+ ## Customizing the Scale
103
+
104
+ Override defaults in `senangstart.config.js`:
105
+
106
+ ```javascript
107
+ export default {
108
+ theme: {
109
+ spacing: {
110
+ 'tiny': '2px', // Tighter tiny
111
+ 'huge': '256px', // Add custom scale
112
+ 'massive': '512px' // Even bigger!
113
+ }
114
+ }
115
+ }
116
+ ```
117
+
118
+ Use your custom scales:
119
+
120
+ ```html
121
+ <section space="p:huge">Huge padding</section>
122
+ <div space="m-b:massive">Massive margin</div>
123
+ ```
@@ -0,0 +1,103 @@
1
+ # Why Natural Language?
2
+
3
+ The philosophy behind SenangStart's natural adjective approach.
4
+
5
+ ## The Problem with Numbers
6
+
7
+ Traditional utility frameworks use abstract numeric scales:
8
+
9
+ ```html
10
+ <!-- What do these numbers mean? -->
11
+ <div class="p-4 m-8 gap-2 text-xl">
12
+ ```
13
+
14
+ Every developer asks:
15
+ - Is `p-4` bigger than `m-8`?
16
+ - What's the difference between `gap-2` and `gap-4`?
17
+ - Is `text-xl` larger than `text-lg`?
18
+
19
+ **You constantly lookup documentation.** Mental overhead slows you down.
20
+
21
+ ## The Natural Solution
22
+
23
+ SenangStart uses words you already understand:
24
+
25
+ ```html
26
+ <!-- Instantly clear -->
27
+ <div space="p:medium m:big g:small" visual="text-size:big">
28
+ ```
29
+
30
+ No lookup needed. You *know* that:
31
+ - `big` is larger than `medium`
32
+ - `medium` is larger than `small`
33
+ - `giant` is larger than `big`
34
+
35
+ ## Physical Mental Models
36
+
37
+ Each scale maps to a physical object you can visualize:
38
+
39
+ | Keyword | Physical Model | Example Use |
40
+ |---------|---------------|-------------|
41
+ | `tiny` | 🪨 Pebble | Icon gaps, borders |
42
+ | `small` | 📦 Matchbox | Form field spacing |
43
+ | `medium` | 📱 Smartphone | Standard padding |
44
+ | `big` | 💻 Laptop | Section spacing |
45
+ | `giant` | 🚪 Door | Layout divisions |
46
+ | `vast` | 🏠 House | Hero sections |
47
+
48
+ When you think "I need laptop-sized spacing here", you write `big`.
49
+
50
+ ## AI-Friendly Communication
51
+
52
+ Natural language works better with AI assistants:
53
+
54
+ ### Traditional Approach
55
+ > "Make the padding larger"
56
+ > AI: "Should I use p-6, p-8, or p-12?"
57
+
58
+ ### SenangStart Approach
59
+ > "Make the padding larger"
60
+ > AI: "Changed from `medium` to `big`" ✓
61
+
62
+ The AI understands the *intent* behind your words.
63
+
64
+ ## Semantic Conversations
65
+
66
+ With SenangStart, you can speak naturally:
67
+
68
+ | You Say | AI Understands |
69
+ |---------|---------------|
70
+ | "tighten it up" | Scale DOWN (medium → small → tiny) |
71
+ | "give it breathing room" | Scale UP (medium → big → giant) |
72
+ | "make it more compact" | Use smaller spacing |
73
+ | "it feels cramped" | Increase spacing |
74
+ | "too much whitespace" | Reduce spacing |
75
+
76
+ ## Separation of Concerns
77
+
78
+ Three attributes keep your code organized:
79
+
80
+ ```html
81
+ <div
82
+ layout="flex col center" <!-- Structure -->
83
+ space="p:medium g:small" <!-- Sizing -->
84
+ visual="bg:white rounded:big" <!-- Appearance -->
85
+ >
86
+ ```
87
+
88
+ Anyone reading this code instantly knows:
89
+ - **What it does** (flexbox, column, centered)
90
+ - **How big it is** (medium padding, small gap)
91
+ - **How it looks** (white, rounded)
92
+
93
+ ## The Intent-First Mindset
94
+
95
+ Stop thinking in pixels. Start describing intent.
96
+
97
+ | Instead of... | Think... |
98
+ |---------------|----------|
99
+ | "I need 16px padding" | "I need medium padding" |
100
+ | "Add 8px gap" | "Add a small gap" |
101
+ | "Make it 32px margin" | "Give it big margin" |
102
+
103
+ **Your code becomes self-documenting.**
@@ -0,0 +1,129 @@
1
+ # Responsive Design
2
+
3
+ SenangStart uses mobile-first responsive prefixes.
4
+
5
+ ## Breakpoints
6
+
7
+ | Prefix | Min-Width | Device |
8
+ |--------|-----------|--------|
9
+ | (none) | 0px | Mobile (default) |
10
+ | `mob:` | 480px | Large mobile |
11
+ | `tab:` | 768px | Tablet |
12
+ | `lap:` | 1024px | Laptop |
13
+ | `desk:` | 1280px | Desktop |
14
+
15
+ ## Usage
16
+
17
+ Add breakpoint prefixes to any space or layout value:
18
+
19
+ ```html
20
+ <div space="p:small tab:p:medium lap:p:big">
21
+ <!-- Small padding on mobile -->
22
+ <!-- Medium padding on tablet+ -->
23
+ <!-- Big padding on laptop+ -->
24
+ </div>
25
+ ```
26
+
27
+ ## Common Patterns
28
+
29
+ ### Responsive Padding
30
+
31
+ ```html
32
+ <section space="p:medium tab:p:big desk:p:giant">
33
+ Content with progressive padding
34
+ </section>
35
+ ```
36
+
37
+ ### Responsive Layout
38
+
39
+ ```html
40
+ <div layout="flex col tab:row">
41
+ <!-- Stacked on mobile, horizontal on tablet+ -->
42
+ <div>Item 1</div>
43
+ <div>Item 2</div>
44
+ </div>
45
+ ```
46
+
47
+ ### Responsive Grid
48
+
49
+ ```html
50
+ <div
51
+ layout="grid"
52
+ space="g:small tab:g:medium"
53
+ style="grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));"
54
+ >
55
+ <div>Card 1</div>
56
+ <div>Card 2</div>
57
+ <div>Card 3</div>
58
+ </div>
59
+ ```
60
+
61
+ ### Hide on Mobile
62
+
63
+ ```html
64
+ <nav layout="hidden tab:flex">
65
+ <!-- Hidden on mobile, flex on tablet+ -->
66
+ </nav>
67
+ ```
68
+
69
+ ### Mobile Navigation
70
+
71
+ ```html
72
+ <!-- Mobile menu button -->
73
+ <button layout="block tab:hidden">☰ Menu</button>
74
+
75
+ <!-- Desktop navigation -->
76
+ <nav layout="hidden tab:flex" space="g:medium">
77
+ <a>Home</a>
78
+ <a>About</a>
79
+ <a>Contact</a>
80
+ </nav>
81
+ ```
82
+
83
+ ## Full Responsive Example
84
+
85
+ ```html
86
+ <div
87
+ layout="flex col lap:row"
88
+ space="p:medium tab:p:big gap:medium tab:gap:big"
89
+ >
90
+ <!-- Sidebar -->
91
+ <aside
92
+ space="w:[100%] lap:w:[300px]"
93
+ visual="bg:light"
94
+ >
95
+ Sidebar content
96
+ </aside>
97
+
98
+ <!-- Main content -->
99
+ <main space="w:[100%] lap:w:[calc(100%-300px)]">
100
+ Main content
101
+ </main>
102
+ </div>
103
+ ```
104
+
105
+ ## Custom Breakpoints
106
+
107
+ Override in `senangstart.config.js`:
108
+
109
+ ```javascript
110
+ export default {
111
+ theme: {
112
+ screens: {
113
+ 'mob': '480px',
114
+ 'tab': '768px',
115
+ 'lap': '1024px',
116
+ 'desk': '1280px',
117
+ 'wide': '1536px' // Add custom breakpoint
118
+ }
119
+ }
120
+ }
121
+ ```
122
+
123
+ Use your custom breakpoint:
124
+
125
+ ```html
126
+ <div space="p:big wide:p:giant">
127
+ Extra large padding on wide screens
128
+ </div>
129
+ ```
@@ -0,0 +1,162 @@
1
+ # Hover & States
2
+
3
+ Add interactive styles with state prefixes.
4
+
5
+ ## State Prefixes
6
+
7
+ | Prefix | Trigger |
8
+ |--------|---------|
9
+ | `hover:` | Mouse over element |
10
+ | `focus:` | Element has focus |
11
+ | `active:` | Element is being clicked |
12
+ | `disabled:` | Element is disabled |
13
+
14
+ ## Basic Usage
15
+
16
+ ### Hover
17
+
18
+ ```html
19
+ <button visual="bg:primary hover:bg:[#2563EB] text:white">
20
+ Hover me
21
+ </button>
22
+
23
+ <a visual="text:grey hover:text:primary">
24
+ Link with hover color
25
+ </a>
26
+ ```
27
+
28
+ ### Focus
29
+
30
+ ```html
31
+ <input
32
+ visual="border:grey focus:border:primary"
33
+ space="p:small"
34
+ />
35
+ ```
36
+
37
+ ### Active
38
+
39
+ ```html
40
+ <button visual="bg:primary active:bg:[#1D4ED8]">
41
+ Click me
42
+ </button>
43
+ ```
44
+
45
+ ### Disabled
46
+
47
+ ```html
48
+ <button visual="bg:primary disabled:bg:grey disabled:opacity:[0.5]">
49
+ Submit
50
+ </button>
51
+ ```
52
+
53
+ ## Common Patterns
54
+
55
+ ### Button with States
56
+
57
+ ```html
58
+ <button
59
+ space="p-x:big p-y:small"
60
+ visual="
61
+ bg:primary
62
+ text:white
63
+ rounded:medium
64
+ hover:bg:[#2563EB]
65
+ active:bg:[#1D4ED8]
66
+ disabled:bg:grey
67
+ disabled:opacity:[0.5]
68
+ "
69
+ >
70
+ Submit
71
+ </button>
72
+ ```
73
+
74
+ ### Card with Hover Effect
75
+
76
+ ```html
77
+ <div
78
+ layout="flex col"
79
+ space="p:medium"
80
+ visual="
81
+ bg:white
82
+ rounded:big
83
+ shadow:small
84
+ hover:shadow:big
85
+ "
86
+ >
87
+ <h3>Card Title</h3>
88
+ <p>Card content that lifts on hover.</p>
89
+ </div>
90
+ ```
91
+
92
+ ### Link Navigation
93
+
94
+ ```html
95
+ <nav layout="flex" space="g:medium">
96
+ <a visual="text:dark hover:text:primary font:medium">Home</a>
97
+ <a visual="text:grey hover:text:primary">About</a>
98
+ <a visual="text:grey hover:text:primary">Contact</a>
99
+ </nav>
100
+ ```
101
+
102
+ ### Input with Focus Ring
103
+
104
+ ```html
105
+ <input
106
+ type="text"
107
+ space="p:small w:[100%]"
108
+ visual="
109
+ border:grey
110
+ border-w:[1px]
111
+ rounded:small
112
+ focus:border:primary
113
+ "
114
+ placeholder="Enter your email"
115
+ />
116
+ ```
117
+
118
+ ### Toggle Button
119
+
120
+ ```html
121
+ <button
122
+ space="p:small"
123
+ visual="
124
+ bg:light
125
+ text:dark
126
+ rounded:medium
127
+ hover:bg:grey
128
+ active:bg:dark
129
+ active:text:white
130
+ "
131
+ >
132
+ Toggle
133
+ </button>
134
+ ```
135
+
136
+ ## Combining with Responsive
137
+
138
+ States can be combined with responsive prefixes:
139
+
140
+ ```html
141
+ <button visual="
142
+ bg:primary
143
+ hover:bg:[#2563EB]
144
+ tab:hover:shadow:big
145
+ ">
146
+ Hover shadow only on tablet+
147
+ </button>
148
+ ```
149
+
150
+ ## Accessibility Note
151
+
152
+ Always ensure sufficient color contrast for hover and focus states. The `:focus` state is especially important for keyboard navigation.
153
+
154
+ ```html
155
+ <button visual="
156
+ bg:primary
157
+ text:white
158
+ focus:shadow:[0_0_0_3px_rgba(59,130,246,0.5)]
159
+ ">
160
+ Accessible focus ring
161
+ </button>
162
+ ```
@@ -0,0 +1,187 @@
1
+ # Tri-Attribute Syntax
2
+
3
+ SenangStart separates styling concerns into three distinct attributes.
4
+
5
+ ## Overview
6
+
7
+ | Attribute | Purpose | Example |
8
+ |-----------|---------|---------|
9
+ | `layout` | Structure & positioning | `layout="flex col center"` |
10
+ | `space` | Sizing & spacing | `space="p:medium g:small"` |
11
+ | `visual` | Colors & appearance | `visual="bg:white rounded:big"` |
12
+
13
+ ## Why Three Attributes?
14
+
15
+ ### Traditional CSS classes are chaotic:
16
+
17
+ ```html
18
+ <div class="flex flex-col items-center p-4 gap-2 bg-white rounded-lg shadow-md">
19
+ ```
20
+
21
+ Everything is mixed together. What's layout? What's spacing? What's visual?
22
+
23
+ ### SenangStart is organized:
24
+
25
+ ```html
26
+ <div
27
+ layout="flex col center"
28
+ space="p:medium g:small"
29
+ visual="bg:white rounded:big shadow:medium"
30
+ >
31
+ ```
32
+
33
+ **Clear separation.** Anyone reading this code instantly knows:
34
+ - **Structure:** Flexbox column, centered
35
+ - **Sizing:** Medium padding, small gap
36
+ - **Appearance:** White, rounded, shadowed
37
+
38
+ ## The `layout` Attribute
39
+
40
+ Controls **how elements are positioned** and **how they flow**.
41
+
42
+ ### Display Types
43
+
44
+ ```html
45
+ <div layout="flex">Flexbox container</div>
46
+ <div layout="grid">Grid container</div>
47
+ <div layout="block">Block element</div>
48
+ <div layout="hidden">Hidden element</div>
49
+ ```
50
+
51
+ ### Flex Direction
52
+
53
+ ```html
54
+ <div layout="flex row">Horizontal (default)</div>
55
+ <div layout="flex col">Vertical</div>
56
+ <div layout="flex row-reverse">Reversed horizontal</div>
57
+ <div layout="flex col-reverse">Reversed vertical</div>
58
+ ```
59
+
60
+ ### Alignment
61
+
62
+ ```html
63
+ <div layout="flex center">Center both axes</div>
64
+ <div layout="flex between">Space between items</div>
65
+ <div layout="flex start">Align to start</div>
66
+ <div layout="flex end">Align to end</div>
67
+ ```
68
+
69
+ ### Position
70
+
71
+ ```html
72
+ <nav layout="fixed z:top">Fixed navigation</nav>
73
+ <div layout="sticky">Sticky element</div>
74
+ <div layout="absolute z:high">Absolute positioned</div>
75
+ <div layout="relative">Relative positioned</div>
76
+ ```
77
+
78
+ ## The `space` Attribute
79
+
80
+ Controls **sizing and spacing** using the natural scale.
81
+
82
+ ### Syntax
83
+
84
+ ```
85
+ [breakpoint]:[property]:[scale]
86
+ ```
87
+
88
+ ### Padding
89
+
90
+ ```html
91
+ <div space="p:medium">All sides</div>
92
+ <div space="p-x:big p-y:small">Horizontal & vertical</div>
93
+ <div space="p-t:small p-b:big">Top & bottom</div>
94
+ ```
95
+
96
+ ### Margin
97
+
98
+ ```html
99
+ <div space="m:medium">All sides</div>
100
+ <div space="m-b:big">Bottom only</div>
101
+ <div space="m-x:auto">Center horizontally</div>
102
+ ```
103
+
104
+ ### Gap (Flex/Grid)
105
+
106
+ ```html
107
+ <div layout="flex" space="g:small">Small gap</div>
108
+ <div layout="grid" space="g:medium">Medium gap</div>
109
+ ```
110
+
111
+ ### Sizing
112
+
113
+ ```html
114
+ <div space="w:[100%] h:[400px]">Explicit size</div>
115
+ <div space="max-w:[1200px] min-h:[80vh]">Constraints</div>
116
+ ```
117
+
118
+ ### Arbitrary Values (Escape Hatch)
119
+
120
+ Use brackets for specific values:
121
+
122
+ ```html
123
+ <div space="w:[350px]">350px width</div>
124
+ <div space="p:[20px_40px]">20px top/bottom, 40px left/right</div>
125
+ <div space="m-t:[5rem]">5rem top margin</div>
126
+ ```
127
+
128
+ ## The `visual` Attribute
129
+
130
+ Controls **colors, textures, and appearance**.
131
+
132
+ ### Background
133
+
134
+ ```html
135
+ <div visual="bg:white">White background</div>
136
+ <div visual="bg:primary">Primary color</div>
137
+ <div visual="bg:[#FF5733]">Custom hex</div>
138
+ ```
139
+
140
+ ### Text
141
+
142
+ ```html
143
+ <span visual="text:dark">Dark text</span>
144
+ <span visual="text:grey text-size:small">Grey, small text</span>
145
+ <span visual="font:bold">Bold text</span>
146
+ ```
147
+
148
+ ### Borders & Shadows
149
+
150
+ ```html
151
+ <div visual="rounded:medium shadow:big">Rounded with shadow</div>
152
+ <div visual="border:grey border-w:[2px]">Grey border</div>
153
+ ```
154
+
155
+ ### Combining Properties
156
+
157
+ ```html
158
+ <div visual="bg:white rounded:big shadow:medium text:dark">
159
+ Card with multiple visual properties
160
+ </div>
161
+ ```
162
+
163
+ ## Combining All Three
164
+
165
+ Here's a complete example:
166
+
167
+ ```html
168
+ <div
169
+ layout="flex col"
170
+ space="w:[320px] p:medium g:small"
171
+ visual="bg:white rounded:big shadow:medium"
172
+ >
173
+ <h2 visual="font:bold text-size:big text:dark">Card Title</h2>
174
+ <p visual="text:grey">Card description goes here.</p>
175
+ <button
176
+ space="p-x:big p-y:small"
177
+ visual="bg:primary text:white rounded:medium"
178
+ >
179
+ Action
180
+ </button>
181
+ </div>
182
+ ```
183
+
184
+ **Reading this code:**
185
+ - The container is a vertical flex column, 320px wide, with medium padding, small gap, white background, big rounded corners, and medium shadow
186
+ - The title is bold, big text, dark color
187
+ - The button has big horizontal padding, small vertical padding, primary background, white text, medium rounded corners