@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.
- package/.github/workflows/deploy-docs.yml +55 -0
- package/dist/senangstart-css.js +503 -0
- package/dist/senangstart-css.min.js +375 -0
- package/docs/.vitepress/cache/deps/_metadata.json +52 -0
- package/docs/.vitepress/cache/deps/chunk-2CLQ7TTZ.js +9719 -0
- package/docs/.vitepress/cache/deps/chunk-2CLQ7TTZ.js.map +7 -0
- package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js +12824 -0
- package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js.map +7 -0
- package/docs/.vitepress/cache/deps/package.json +3 -0
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +4505 -0
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +7 -0
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +583 -0
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +7 -0
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js +1333 -0
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js.map +7 -0
- package/docs/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js +1665 -0
- package/docs/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js.map +7 -0
- package/docs/.vitepress/cache/deps/vitepress___minisearch.js +1813 -0
- package/docs/.vitepress/cache/deps/vitepress___minisearch.js.map +7 -0
- package/docs/.vitepress/cache/deps/vue.js +347 -0
- package/docs/.vitepress/cache/deps/vue.js.map +7 -0
- package/docs/.vitepress/config.js +108 -0
- package/docs/.vitepress/dist/404.html +22 -0
- package/docs/.vitepress/dist/assets/app.BTYj1wZj.js +1 -0
- package/docs/.vitepress/dist/assets/chunks/@localSearchIndexroot.DmMP4oUp.js +1 -0
- package/docs/.vitepress/dist/assets/chunks/VPLocalSearchBox.jxQ0k_uL.js +9 -0
- package/docs/.vitepress/dist/assets/chunks/framework.qISVh_QZ.js +19 -0
- package/docs/.vitepress/dist/assets/chunks/theme.B9Wtbwgj.js +2 -0
- package/docs/.vitepress/dist/assets/examples_cards.md.D4i0phvj.js +84 -0
- package/docs/.vitepress/dist/assets/examples_cards.md.D4i0phvj.lean.js +1 -0
- package/docs/.vitepress/dist/assets/examples_forms.md.BnsjqHST.js +169 -0
- package/docs/.vitepress/dist/assets/examples_forms.md.BnsjqHST.lean.js +1 -0
- package/docs/.vitepress/dist/assets/examples_hero.md.CCcb2x8Y.js +118 -0
- package/docs/.vitepress/dist/assets/examples_hero.md.CCcb2x8Y.lean.js +1 -0
- package/docs/.vitepress/dist/assets/examples_index.md.CcyXbirn.js +52 -0
- package/docs/.vitepress/dist/assets/examples_index.md.CcyXbirn.lean.js +1 -0
- package/docs/.vitepress/dist/assets/examples_navigation.md.CppyHbnP.js +106 -0
- package/docs/.vitepress/dist/assets/examples_navigation.md.CppyHbnP.lean.js +1 -0
- package/docs/.vitepress/dist/assets/guide_cdn.md.CANCjnm5.js +30 -0
- package/docs/.vitepress/dist/assets/guide_cdn.md.CANCjnm5.lean.js +1 -0
- package/docs/.vitepress/dist/assets/guide_cli.md.zXEKk-bu.js +44 -0
- package/docs/.vitepress/dist/assets/guide_cli.md.zXEKk-bu.lean.js +1 -0
- package/docs/.vitepress/dist/assets/guide_configuration.md.D2JZzhKm.js +79 -0
- package/docs/.vitepress/dist/assets/guide_configuration.md.D2JZzhKm.lean.js +1 -0
- package/docs/.vitepress/dist/assets/guide_getting-started.md.tO7bvmZd.js +47 -0
- package/docs/.vitepress/dist/assets/guide_getting-started.md.tO7bvmZd.lean.js +1 -0
- package/docs/.vitepress/dist/assets/guide_index.md.C1xk2lBl.js +3 -0
- package/docs/.vitepress/dist/assets/guide_index.md.C1xk2lBl.lean.js +1 -0
- package/docs/.vitepress/dist/assets/guide_natural-scale.md.D1oVRN5V.js +22 -0
- package/docs/.vitepress/dist/assets/guide_natural-scale.md.D1oVRN5V.lean.js +1 -0
- package/docs/.vitepress/dist/assets/guide_philosophy.md.DPyyMH8d.js +7 -0
- package/docs/.vitepress/dist/assets/guide_philosophy.md.DPyyMH8d.lean.js +1 -0
- package/docs/.vitepress/dist/assets/guide_responsive.md.wksOAMT5.js +57 -0
- package/docs/.vitepress/dist/assets/guide_responsive.md.wksOAMT5.lean.js +1 -0
- package/docs/.vitepress/dist/assets/guide_states.md.DRjYOZDJ.js +77 -0
- package/docs/.vitepress/dist/assets/guide_states.md.DRjYOZDJ.lean.js +1 -0
- package/docs/.vitepress/dist/assets/guide_tri-attribute.md.CoFqfmPZ.js +45 -0
- package/docs/.vitepress/dist/assets/guide_tri-attribute.md.CoFqfmPZ.lean.js +1 -0
- package/docs/.vitepress/dist/assets/index.md.CUZJzNzP.js +7 -0
- package/docs/.vitepress/dist/assets/index.md.CUZJzNzP.lean.js +1 -0
- package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
- package/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
- package/docs/.vitepress/dist/assets/reference_breakpoints.md.BEhuwXBS.js +48 -0
- package/docs/.vitepress/dist/assets/reference_breakpoints.md.BEhuwXBS.lean.js +1 -0
- package/docs/.vitepress/dist/assets/reference_colors.md.Do4abjs1.js +29 -0
- package/docs/.vitepress/dist/assets/reference_colors.md.Do4abjs1.lean.js +1 -0
- package/docs/.vitepress/dist/assets/reference_layout.md.DqSoofMZ.js +13 -0
- package/docs/.vitepress/dist/assets/reference_layout.md.DqSoofMZ.lean.js +1 -0
- package/docs/.vitepress/dist/assets/reference_space.md.luOYAfQg.js +24 -0
- package/docs/.vitepress/dist/assets/reference_space.md.luOYAfQg.lean.js +1 -0
- package/docs/.vitepress/dist/assets/reference_spacing.md.DdsDhDhS.js +32 -0
- package/docs/.vitepress/dist/assets/reference_spacing.md.DdsDhDhS.lean.js +1 -0
- package/docs/.vitepress/dist/assets/reference_visual.md.DZFvxgPk.js +22 -0
- package/docs/.vitepress/dist/assets/reference_visual.md.DZFvxgPk.lean.js +1 -0
- package/docs/.vitepress/dist/assets/style.BuMqNgkb.css +1 -0
- package/docs/.vitepress/dist/examples/cards.html +108 -0
- package/docs/.vitepress/dist/examples/forms.html +193 -0
- package/docs/.vitepress/dist/examples/hero.html +142 -0
- package/docs/.vitepress/dist/examples/index.html +76 -0
- package/docs/.vitepress/dist/examples/navigation.html +130 -0
- package/docs/.vitepress/dist/guide/cdn.html +54 -0
- package/docs/.vitepress/dist/guide/cli.html +68 -0
- package/docs/.vitepress/dist/guide/configuration.html +103 -0
- package/docs/.vitepress/dist/guide/getting-started.html +71 -0
- package/docs/.vitepress/dist/guide/index.html +27 -0
- package/docs/.vitepress/dist/guide/natural-scale.html +46 -0
- package/docs/.vitepress/dist/guide/philosophy.html +31 -0
- package/docs/.vitepress/dist/guide/responsive.html +81 -0
- package/docs/.vitepress/dist/guide/states.html +101 -0
- package/docs/.vitepress/dist/guide/tri-attribute.html +69 -0
- package/docs/.vitepress/dist/hashmap.json +1 -0
- package/docs/.vitepress/dist/index.html +31 -0
- package/docs/.vitepress/dist/reference/breakpoints.html +72 -0
- package/docs/.vitepress/dist/reference/colors.html +53 -0
- package/docs/.vitepress/dist/reference/layout.html +37 -0
- package/docs/.vitepress/dist/reference/space.html +48 -0
- package/docs/.vitepress/dist/reference/spacing.html +56 -0
- package/docs/.vitepress/dist/reference/visual.html +46 -0
- package/docs/.vitepress/dist/vp-icons.css +1 -0
- package/docs/.vitepress/theme/custom.css +65 -0
- package/docs/.vitepress/theme/index.js +4 -0
- package/docs/examples/cards.md +116 -0
- package/docs/examples/forms.md +207 -0
- package/docs/examples/hero.md +150 -0
- package/docs/examples/index.md +87 -0
- package/docs/examples/navigation.md +144 -0
- package/docs/guide/cdn.md +110 -0
- package/docs/guide/cli.md +174 -0
- package/docs/guide/configuration.md +152 -0
- package/docs/guide/getting-started.md +130 -0
- package/docs/guide/index.md +64 -0
- package/docs/guide/natural-scale.md +123 -0
- package/docs/guide/philosophy.md +103 -0
- package/docs/guide/responsive.md +129 -0
- package/docs/guide/states.md +162 -0
- package/docs/guide/tri-attribute.md +187 -0
- package/docs/index.md +64 -0
- package/docs/reference/breakpoints.md +131 -0
- package/docs/reference/colors.md +106 -0
- package/docs/reference/layout.md +115 -0
- package/docs/reference/space.md +121 -0
- package/docs/reference/spacing.md +74 -0
- package/docs/reference/visual.md +160 -0
- package/package.json +7 -13
- 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
|