ether-code 0.3.8 → 0.3.9

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/cli/ether.js CHANGED
@@ -6,7 +6,7 @@ const http = require('http')
6
6
  const { EtherCompiler } = require('./compiler')
7
7
  const { Watcher } = require('./watcher')
8
8
 
9
- const VERSION = '0.3.8'
9
+ const VERSION = '0.3.9'
10
10
 
11
11
  const COLORS = {
12
12
  reset: '\x1b[0m',
@@ -76,330 +76,282 @@ const FAVICON_SVG = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 499 50
76
76
  <path fill="url(#f3)" d="M213.282,235.909c14.12-20.019,28.129-36.342,31.945-40.798c5.362-6.26,5.762-5.197,8.629-5.197c2.869,0,132.714,0.003,132.714,0.003s2.916-0.469,4.863,1.864c1.029,1.235-0.298,5.654-0.298,5.654l-9.552,40.332c0,0-1.318,5.72-6.366,5.649C334.696,242.847,208.748,250.903,213.282,235.909"/>
77
77
  </svg>`
78
78
 
79
- const STYLES_CSS = `:root {
80
- --color-primary: #6366f1;
81
- --color-secondary: #8b5cf6;
82
- --color-accent: #06b6d4;
83
- --color-bg: #16162a;
84
- --color-bg-light: #1e1e3a;
85
- --color-surface: #252545;
86
- --color-text: #e2e8f0;
87
- --color-text-muted: #94a3b8;
88
- }
89
-
90
- * {
91
- margin: 0;
92
- padding: 0;
93
- box-sizing: border-box;
94
- }
95
-
96
- body {
97
- font-family: 'Inter', system-ui, -apple-system, sans-serif;
98
- background: linear-gradient(180deg, var(--color-bg) 0%, var(--color-bg-light) 50%, var(--color-bg) 100%);
99
- color: var(--color-text);
100
- line-height: 1.6;
101
- min-height: 100vh;
102
- }
103
-
104
- .hero {
105
- min-height: 100vh;
106
- position: relative;
107
- overflow: hidden;
108
- }
109
-
110
- .hero::before {
111
- content: '';
112
- position: absolute;
113
- top: 0;
114
- left: 0;
115
- right: 0;
116
- bottom: 0;
117
- background:
118
- radial-gradient(ellipse at 20% 20%, rgba(99, 102, 241, 0.15) 0%, transparent 50%),
119
- radial-gradient(ellipse at 80% 80%, rgba(139, 92, 246, 0.1) 0%, transparent 50%),
120
- radial-gradient(ellipse at 50% 50%, rgba(6, 182, 212, 0.05) 0%, transparent 70%);
121
- pointer-events: none;
122
- }
123
-
124
- .navbar {
125
- display: flex;
126
- justify-content: space-between;
127
- align-items: center;
128
- padding: 1.25rem 5%;
129
- position: fixed;
130
- width: 100%;
131
- top: 0;
132
- z-index: 100;
133
- background: rgba(22, 22, 42, 0.85);
134
- backdrop-filter: blur(12px);
135
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
136
- }
137
-
138
- .logo {
139
- display: flex;
140
- align-items: center;
141
- gap: 0.75rem;
142
- font-size: 1.5rem;
143
- font-weight: 700;
144
- color: var(--color-text);
145
- text-decoration: none;
146
- }
147
-
148
- .logo-icon {
149
- width: 2.5rem;
150
- height: 2.5rem;
151
- }
152
-
153
- .nav-links {
154
- display: flex;
155
- list-style: none;
156
- gap: 2.5rem;
157
- margin-left: auto;
158
- padding-right: 1rem;
159
- }
160
-
161
- .nav-links a {
162
- color: var(--color-text-muted);
163
- text-decoration: none;
164
- font-weight: 500;
165
- font-size: 0.95rem;
166
- transition: color 0.2s ease;
167
- }
168
-
169
- .nav-links a:hover {
170
- color: var(--color-accent);
171
- }
172
-
173
- .hero-content {
174
- position: relative;
175
- text-align: center;
176
- padding: 10rem 5% 6rem;
177
- max-width: 900px;
178
- margin: 0 auto;
179
- }
180
-
181
- .hero-title {
182
- font-size: 4rem;
183
- font-weight: 800;
184
- margin-bottom: 1.5rem;
185
- line-height: 1.1;
186
- letter-spacing: -0.02em;
187
- }
188
-
189
- .gradient-text {
190
- background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-accent) 50%, var(--color-secondary) 100%);
191
- -webkit-background-clip: text;
192
- -webkit-text-fill-color: transparent;
193
- background-clip: text;
194
- }
195
-
196
- .hero-subtitle {
197
- font-size: 1.25rem;
198
- color: var(--color-text-muted);
199
- margin-bottom: 2.5rem;
200
- max-width: 600px;
201
- margin-left: auto;
202
- margin-right: auto;
203
- line-height: 1.7;
204
- }
205
-
206
- .hero-buttons {
207
- display: flex;
208
- gap: 1rem;
209
- justify-content: center;
210
- flex-wrap: wrap;
211
- }
212
-
213
- .btn {
214
- display: inline-flex;
215
- align-items: center;
216
- padding: 0.9rem 2rem;
217
- border-radius: 0.75rem;
218
- font-size: 1rem;
219
- font-weight: 600;
220
- text-decoration: none;
221
- transition: all 0.2s ease;
222
- border: none;
223
- cursor: pointer;
224
- }
225
-
226
- .btn-primary {
227
- background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-secondary) 100%);
228
- color: white;
229
- box-shadow: 0 4px 15px rgba(99, 102, 241, 0.3);
230
- }
231
-
232
- .btn-primary:hover {
233
- transform: translateY(-2px);
234
- box-shadow: 0 8px 25px rgba(99, 102, 241, 0.4);
235
- }
236
-
237
- .btn-secondary {
238
- background: rgba(255, 255, 255, 0.05);
239
- color: var(--color-text);
240
- border: 1px solid rgba(255, 255, 255, 0.1);
241
- }
242
-
243
- .btn-secondary:hover {
244
- background: rgba(255, 255, 255, 0.1);
245
- border-color: rgba(255, 255, 255, 0.2);
246
- }
247
-
248
- .features {
249
- padding: 6rem 5%;
250
- position: relative;
251
- }
252
-
253
- .section-title {
254
- text-align: center;
255
- font-size: 2.5rem;
256
- font-weight: 700;
257
- margin-bottom: 3.5rem;
258
- letter-spacing: -0.01em;
259
- }
260
-
261
- .features-grid {
262
- display: grid;
263
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
264
- gap: 1.5rem;
265
- max-width: 1200px;
266
- margin: 0 auto;
267
- }
268
-
269
- .feature-card {
270
- background: rgba(255, 255, 255, 0.03);
271
- border: 1px solid rgba(255, 255, 255, 0.06);
272
- padding: 2rem;
273
- border-radius: 1rem;
274
- text-align: center;
275
- transition: all 0.3s ease;
276
- }
277
-
278
- .feature-card:hover {
279
- transform: translateY(-4px);
280
- background: rgba(255, 255, 255, 0.05);
281
- border-color: rgba(99, 102, 241, 0.3);
282
- box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2);
283
- }
284
-
285
- .feature-icon {
286
- font-size: 2.5rem;
287
- margin-bottom: 1rem;
288
- }
289
-
290
- .feature-card h3 {
291
- margin-bottom: 0.75rem;
292
- font-size: 1.25rem;
293
- font-weight: 600;
294
- color: var(--color-text);
295
- }
296
-
297
- .feature-card p {
298
- color: var(--color-text-muted);
299
- font-size: 0.95rem;
300
- line-height: 1.6;
301
- }
302
-
303
- .examples {
304
- padding: 6rem 5%;
305
- background: var(--color-bg-light);
306
- }
307
-
308
- .code-comparison {
309
- display: flex;
310
- align-items: stretch;
311
- justify-content: center;
312
- gap: 1.5rem;
313
- max-width: 900px;
314
- margin: 0 auto;
315
- }
316
-
317
- .code-block {
318
- background: var(--color-bg);
319
- border: 1px solid rgba(255, 255, 255, 0.08);
320
- border-radius: 1rem;
321
- overflow: hidden;
322
- flex: 1;
323
- max-width: 400px;
324
- }
325
-
326
- .code-header {
327
- background: rgba(99, 102, 241, 0.15);
328
- padding: 0.75rem 1rem;
329
- font-weight: 600;
330
- font-size: 0.85rem;
331
- color: var(--color-accent);
332
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
333
- }
334
-
335
- .code-block pre {
336
- padding: 1.25rem;
337
- margin: 0;
338
- overflow-x: auto;
339
- }
340
-
341
- .code-block code {
342
- font-family: 'Fira Code', 'Monaco', 'Consolas', monospace;
343
- font-size: 0.8rem;
344
- line-height: 1.6;
345
- color: var(--color-text-muted);
346
- white-space: pre;
347
- display: block;
348
- }
349
-
350
- .code-arrow {
351
- display: flex;
352
- align-items: center;
353
- font-size: 1.5rem;
354
- color: var(--color-primary);
355
- padding: 0 0.5rem;
356
- }
357
-
358
- .footer {
359
- text-align: center;
360
- padding: 3rem 5%;
361
- background: var(--color-bg);
362
- border-top: 1px solid rgba(255, 255, 255, 0.05);
363
- }
364
-
365
- .footer p {
366
- color: var(--color-text-muted);
367
- }
368
-
369
- .heart {
370
- color: #ef4444;
371
- }
372
-
373
- .copyright {
374
- margin-top: 0.5rem;
375
- font-size: 0.875rem;
376
- opacity: 0.7;
377
- }
378
-
379
- @media (max-width: 768px) {
380
- .hero-title {
381
- font-size: 2.5rem;
382
- }
383
-
384
- .nav-links {
385
- display: none;
386
- }
387
-
388
- .code-comparison {
389
- flex-direction: column;
390
- align-items: center;
391
- }
392
-
393
- .code-block {
394
- max-width: 100%;
395
- width: 100%;
396
- }
397
-
398
- .code-arrow {
399
- transform: rotate(90deg);
400
- padding: 1rem 0;
401
- }
402
- }
79
+ const STYLES_ETH = `// cible: css
80
+
81
+ :root
82
+ color-primary: #6366f1
83
+ color-secondary: #8b5cf6
84
+ color-accent: #06b6d4
85
+ color-bg: #16162a
86
+ color-bg-light: #1e1e3a
87
+ color-surface: #252545
88
+ color-text: #e2e8f0
89
+ color-text-muted: #94a3b8
90
+
91
+ *
92
+ marge: 0
93
+ remplissage: 0
94
+ modele-boite: border-box
95
+
96
+ corps
97
+ famille-police: Inter, system-ui, -apple-system, sans-serif
98
+ fond: linear-gradient(180deg, var(--color-bg) 0%, var(--color-bg-light) 50%, var(--color-bg) 100%)
99
+ couleur: var(--color-text)
100
+ hauteur-ligne: 1.6
101
+ min-hauteur: 100vh
102
+
103
+ .hero
104
+ min-hauteur: 100vh
105
+ position: relative
106
+ debordement: hidden
107
+
108
+ .hero::before
109
+ contenu: ""
110
+ position: absolute
111
+ haut: 0
112
+ gauche: 0
113
+ droite: 0
114
+ bas: 0
115
+ fond: radial-gradient(ellipse at 20% 20%, rgba(99, 102, 241, 0.15) 0%, transparent 50%), radial-gradient(ellipse at 80% 80%, rgba(139, 92, 246, 0.1) 0%, transparent 50%), radial-gradient(ellipse at 50% 50%, rgba(6, 182, 212, 0.05) 0%, transparent 70%)
116
+ evenements-pointeur: none
117
+
118
+ .navbar
119
+ affichage: flex
120
+ justifier-contenu: space-between
121
+ aligner-elements: center
122
+ remplissage: 1.25rem 5%
123
+ position: fixed
124
+ largeur: 100%
125
+ haut: 0
126
+ z-index: 100
127
+ fond: rgba(22, 22, 42, 0.85)
128
+ flou-fond: blur(12px)
129
+ bordure-bas: 1px solid rgba(255, 255, 255, 0.05)
130
+
131
+ .logo
132
+ affichage: flex
133
+ aligner-elements: center
134
+ ecart: 0.75rem
135
+ taille-police: 1.5rem
136
+ poids-police: 700
137
+ couleur: var(--color-text)
138
+ decoration-texte: none
139
+
140
+ .logo-icon
141
+ largeur: 2.5rem
142
+ hauteur: 2.5rem
143
+
144
+ .nav-links
145
+ affichage: flex
146
+ liste-style: none
147
+ ecart: 2.5rem
148
+ marge-gauche: auto
149
+ remplissage-droite: 1rem
150
+
151
+ .nav-links lien
152
+ couleur: var(--color-text-muted)
153
+ decoration-texte: none
154
+ poids-police: 500
155
+ taille-police: 0.95rem
156
+ transition: color 0.2s ease
157
+
158
+ .nav-links lien:hover
159
+ couleur: var(--color-accent)
160
+
161
+ .hero-content
162
+ position: relative
163
+ alignement-texte: center
164
+ remplissage: 10rem 5% 6rem
165
+ max-largeur: 900px
166
+ marge: 0 auto
167
+
168
+ .hero-title
169
+ taille-police: 4rem
170
+ poids-police: 800
171
+ marge-bas: 1.5rem
172
+ hauteur-ligne: 1.1
173
+ espacement-lettres: -0.02em
174
+
175
+ .gradient-text
176
+ fond: linear-gradient(135deg, var(--color-primary) 0%, var(--color-accent) 50%, var(--color-secondary) 100%)
177
+ decoupe-fond: text
178
+ couleur-remplissage-texte: transparent
179
+
180
+ .hero-subtitle
181
+ taille-police: 1.25rem
182
+ couleur: var(--color-text-muted)
183
+ marge-bas: 2.5rem
184
+ max-largeur: 600px
185
+ marge-gauche: auto
186
+ marge-droite: auto
187
+ hauteur-ligne: 1.7
188
+
189
+ .hero-buttons
190
+ affichage: flex
191
+ ecart: 1rem
192
+ justifier-contenu: center
193
+ enveloppe-flex: wrap
194
+
195
+ .btn
196
+ affichage: inline-flex
197
+ aligner-elements: center
198
+ remplissage: 0.9rem 2rem
199
+ rayon-bordure: 0.75rem
200
+ taille-police: 1rem
201
+ poids-police: 600
202
+ decoration-texte: none
203
+ transition: all 0.2s ease
204
+ bordure: none
205
+ curseur: pointer
206
+
207
+ .btn-primary
208
+ fond: linear-gradient(135deg, var(--color-primary) 0%, var(--color-secondary) 100%)
209
+ couleur: white
210
+ ombre-boite: 0 4px 15px rgba(99, 102, 241, 0.3)
211
+
212
+ .btn-primary:hover
213
+ transformation: translateY(-2px)
214
+ ombre-boite: 0 8px 25px rgba(99, 102, 241, 0.4)
215
+
216
+ .btn-secondary
217
+ fond: rgba(255, 255, 255, 0.05)
218
+ couleur: var(--color-text)
219
+ bordure: 1px solid rgba(255, 255, 255, 0.1)
220
+
221
+ .btn-secondary:hover
222
+ fond: rgba(255, 255, 255, 0.1)
223
+ couleur-bordure: rgba(255, 255, 255, 0.2)
224
+
225
+ .features
226
+ remplissage: 6rem 5%
227
+ position: relative
228
+
229
+ .section-title
230
+ alignement-texte: center
231
+ taille-police: 2.5rem
232
+ poids-police: 700
233
+ marge-bas: 3.5rem
234
+ espacement-lettres: -0.01em
235
+
236
+ .features-grid
237
+ affichage: grid
238
+ colonnes-grille: repeat(auto-fit, minmax(280px, 1fr))
239
+ ecart: 1.5rem
240
+ max-largeur: 1200px
241
+ marge: 0 auto
242
+
243
+ .feature-card
244
+ fond: rgba(255, 255, 255, 0.03)
245
+ bordure: 1px solid rgba(255, 255, 255, 0.06)
246
+ remplissage: 2rem
247
+ rayon-bordure: 1rem
248
+ alignement-texte: center
249
+ transition: all 0.3s ease
250
+
251
+ .feature-card:hover
252
+ transformation: translateY(-4px)
253
+ fond: rgba(255, 255, 255, 0.05)
254
+ couleur-bordure: rgba(99, 102, 241, 0.3)
255
+ ombre-boite: 0 20px 40px rgba(0, 0, 0, 0.2)
256
+
257
+ .feature-icon
258
+ taille-police: 2.5rem
259
+ marge-bas: 1rem
260
+
261
+ .feature-card titre3
262
+ marge-bas: 0.75rem
263
+ taille-police: 1.25rem
264
+ poids-police: 600
265
+ couleur: var(--color-text)
266
+
267
+ .feature-card paragraphe
268
+ couleur: var(--color-text-muted)
269
+ taille-police: 0.95rem
270
+ hauteur-ligne: 1.6
271
+
272
+ .examples
273
+ remplissage: 6rem 5%
274
+ fond: var(--color-bg-light)
275
+
276
+ .code-comparison
277
+ affichage: flex
278
+ aligner-elements: stretch
279
+ justifier-contenu: center
280
+ ecart: 1.5rem
281
+ max-largeur: 900px
282
+ marge: 0 auto
283
+
284
+ .code-block
285
+ fond: var(--color-bg)
286
+ bordure: 1px solid rgba(255, 255, 255, 0.08)
287
+ rayon-bordure: 1rem
288
+ debordement: hidden
289
+ flex: 1
290
+ max-largeur: 400px
291
+
292
+ .code-header
293
+ fond: rgba(99, 102, 241, 0.15)
294
+ remplissage: 0.75rem 1rem
295
+ poids-police: 600
296
+ taille-police: 0.85rem
297
+ couleur: var(--color-accent)
298
+ bordure-bas: 1px solid rgba(255, 255, 255, 0.05)
299
+
300
+ .code-block pre
301
+ remplissage: 1.25rem
302
+ marge: 0
303
+ debordement-x: auto
304
+
305
+ .code-block code
306
+ famille-police: "Fira Code", Monaco, Consolas, monospace
307
+ taille-police: 0.8rem
308
+ hauteur-ligne: 1.6
309
+ couleur: var(--color-text-muted)
310
+ espace-blanc: pre
311
+ affichage: block
312
+
313
+ .code-arrow
314
+ affichage: flex
315
+ aligner-elements: center
316
+ taille-police: 1.5rem
317
+ couleur: var(--color-primary)
318
+ remplissage: 0 0.5rem
319
+
320
+ .footer
321
+ alignement-texte: center
322
+ remplissage: 3rem 5%
323
+ fond: var(--color-bg)
324
+ bordure-haut: 1px solid rgba(255, 255, 255, 0.05)
325
+
326
+ .footer paragraphe
327
+ couleur: var(--color-text-muted)
328
+
329
+ .heart
330
+ couleur: #ef4444
331
+
332
+ .copyright
333
+ marge-haut: 0.5rem
334
+ taille-police: 0.875rem
335
+ opacite: 0.7
336
+
337
+ @media (max-width: 768px)
338
+ .hero-title
339
+ taille-police: 2.5rem
340
+
341
+ .nav-links
342
+ affichage: none
343
+
344
+ .code-comparison
345
+ direction-flex: column
346
+ aligner-elements: center
347
+
348
+ .code-block
349
+ max-largeur: 100%
350
+ largeur: 100%
351
+
352
+ .code-arrow
353
+ transformation: rotate(90deg)
354
+ remplissage: 1rem 0
403
355
  `
404
356
 
405
357
  function log(msg, color) {
@@ -719,14 +671,14 @@ document
719
671
 
720
672
  const appContent = `// cible: js
721
673
 
722
- console.log("Ether v0.3.5 ready!")
674
+ console.log("Ether v0.3.8 ready!")
723
675
  `
724
676
 
725
677
  const packageContent = '{\n "name": "mon-projet-ether",\n "version": "1.0.0",\n "scripts": {\n "dev": "ether dev",\n "build": "ether build"\n }\n}\n'
726
678
 
727
679
  fs.writeFileSync(path.join(projectDir, 'ether.config.js'), configContent)
728
680
  fs.writeFileSync(path.join(srcDir, 'index.eth'), indexContent)
729
- fs.writeFileSync(path.join(distDir, 'styles.css'), STYLES_CSS)
681
+ fs.writeFileSync(path.join(srcDir, 'styles.eth'), STYLES_ETH)
730
682
  fs.writeFileSync(path.join(srcDir, 'app.eth'), appContent)
731
683
  fs.writeFileSync(path.join(projectDir, 'package.json'), packageContent)
732
684
 
@@ -734,8 +686,8 @@ console.log("Ether v0.3.5 ready!")
734
686
  console.log('')
735
687
  logInfo('Structure creee:')
736
688
  console.log(' src/index.eth')
689
+ console.log(' src/styles.eth')
737
690
  console.log(' src/app.eth')
738
- console.log(' dist/styles.css')
739
691
  console.log(' public/images/logo.svg')
740
692
  console.log(' public/favicon.svg')
741
693
  console.log(' public/videos/')
@@ -244,6 +244,7 @@ class CSSGenerator {
244
244
  'attachement-fond': 'background-attachment',
245
245
  'origine-fond': 'background-origin',
246
246
  'decoupe-fond': 'background-clip',
247
+ 'couleur-remplissage-texte': '-webkit-text-fill-color',
247
248
  'selection-utilisateur': 'user-select',
248
249
  'evenements-pointeur': 'pointer-events',
249
250
  'accrochage-defilement': 'scroll-snap-type',
@@ -554,6 +555,18 @@ class CSSGenerator {
554
555
  value += ' !important'
555
556
  }
556
557
 
558
+ const needsWebkitPrefix = [
559
+ 'background-clip',
560
+ 'box-decoration-break',
561
+ 'text-stroke',
562
+ 'text-stroke-width',
563
+ 'text-stroke-color'
564
+ ]
565
+
566
+ if (needsWebkitPrefix.includes(property) && !property.startsWith('-webkit-')) {
567
+ this.writeLine(`-webkit-${property}: ${value};`)
568
+ }
569
+
557
570
  this.writeLine(`${property}: ${value};`)
558
571
  }
559
572
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ether-code",
3
- "version": "0.3.8",
3
+ "version": "0.3.9",
4
4
  "description": "Ether - Le langage intentionnel",
5
5
  "main": "cli/compiler.js",
6
6
  "bin": {