rook-cli 1.3.9 → 1.3.11

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rook-cli",
3
- "version": "1.3.9",
3
+ "version": "1.3.11",
4
4
  "description": "CLI para instalar componentes Shopify",
5
5
  "repository": {
6
6
  "type": "git",
@@ -805,6 +805,7 @@
805
805
 
806
806
  .rk-modal__media--video,
807
807
  .rk-modal__media--embed {
808
+ position: relative;
808
809
  width: min(90vw, 1200px);
809
810
  max-height: 90vh;
810
811
  border-radius: var(--rk-radius-sm, 4px);
@@ -826,6 +827,120 @@
826
827
  border: none;
827
828
  }
828
829
 
830
+ /* Tap overlay — click to play/pause */
831
+ .rk-modal__tap-overlay {
832
+ position: absolute;
833
+ inset: 0 0 48px 0;
834
+ z-index: 1;
835
+ cursor: pointer;
836
+ }
837
+
838
+ /* Custom controls — Instagram style */
839
+ .rk-modal__controls {
840
+ position: absolute;
841
+ bottom: 0;
842
+ left: 0;
843
+ right: 0;
844
+ z-index: 2;
845
+ display: flex;
846
+ align-items: center;
847
+ gap: 10px;
848
+ padding: 10px 14px;
849
+ background: linear-gradient(transparent, rgba(0, 0, 0, 0.65));
850
+ color: #fff;
851
+ opacity: 1;
852
+ transition: opacity 0.25s ease;
853
+ }
854
+
855
+ .rk-modal__media--video:hover .rk-modal__controls,
856
+ .rk-modal__controls:focus-within {
857
+ opacity: 1;
858
+ }
859
+
860
+ /* Control buttons */
861
+ .rk-modal__ctrl-btn {
862
+ display: flex;
863
+ align-items: center;
864
+ justify-content: center;
865
+ width: 32px;
866
+ height: 32px;
867
+ flex-shrink: 0;
868
+ padding: 0;
869
+ background: none;
870
+ border: none;
871
+ color: #fff;
872
+ cursor: pointer;
873
+ border-radius: 50%;
874
+ transition: background-color 0.15s ease;
875
+ }
876
+
877
+ .rk-modal__ctrl-btn:hover {
878
+ background-color: rgba(255, 255, 255, 0.15);
879
+ }
880
+
881
+ .rk-modal__ctrl-icon {
882
+ width: 18px;
883
+ height: 18px;
884
+ display: none;
885
+ }
886
+
887
+ /* Play/pause icon toggle */
888
+ .rk-modal__controls.is-paused .rk-modal__ctrl-icon--play,
889
+ .rk-modal__controls:not(.is-playing):not(.is-paused) .rk-modal__ctrl-icon--play {
890
+ display: block;
891
+ }
892
+
893
+ .rk-modal__controls.is-playing .rk-modal__ctrl-icon--pause {
894
+ display: block;
895
+ }
896
+
897
+ /* Mute icon toggle */
898
+ .rk-modal__controls.is-muted .rk-modal__ctrl-icon--muted {
899
+ display: block;
900
+ }
901
+
902
+ .rk-modal__controls.is-unmuted .rk-modal__ctrl-icon--unmuted {
903
+ display: block;
904
+ }
905
+
906
+ .rk-modal__controls:not(.is-muted):not(.is-unmuted) .rk-modal__ctrl-icon--muted {
907
+ display: block;
908
+ }
909
+
910
+ /* Progress bar */
911
+ .rk-modal__progress {
912
+ flex: 1;
913
+ height: 3px;
914
+ background: rgba(255, 255, 255, 0.3);
915
+ border-radius: 2px;
916
+ cursor: pointer;
917
+ position: relative;
918
+ transition: height 0.15s ease;
919
+ }
920
+
921
+ .rk-modal__progress:hover {
922
+ height: 5px;
923
+ }
924
+
925
+ .rk-modal__progress-bar {
926
+ height: 100%;
927
+ width: 0%;
928
+ background: #fff;
929
+ border-radius: 2px;
930
+ transition: none;
931
+ pointer-events: none;
932
+ }
933
+
934
+ /* Time display */
935
+ .rk-modal__time {
936
+ font-size: 12px;
937
+ font-variant-numeric: tabular-nums;
938
+ min-width: 32px;
939
+ text-align: center;
940
+ opacity: 0.85;
941
+ user-select: none;
942
+ }
943
+
829
944
  .rk-modal__media--html {
830
945
  background: #fff;
831
946
  border-radius: var(--rk-radius);
@@ -841,6 +956,21 @@
841
956
  width: 100vw;
842
957
  border-radius: 0;
843
958
  }
959
+
960
+ .rk-modal__controls {
961
+ padding: 8px 10px;
962
+ gap: 8px;
963
+ }
964
+
965
+ .rk-modal__ctrl-btn {
966
+ width: 28px;
967
+ height: 28px;
968
+ }
969
+
970
+ .rk-modal__ctrl-icon {
971
+ width: 16px;
972
+ height: 16px;
973
+ }
844
974
  }
845
975
 
846
976
  /* --------------------------------------------------------------------------
@@ -2,8 +2,8 @@
2
2
  Rook UI Core — Modal Media Lightbox Controller
3
3
  Web Component: <rk-modal-element>
4
4
 
5
- Handles image zoom, hosted video, YouTube/Vimeo embeds, and raw HTML
6
- in a fullscreen lightbox overlay.
5
+ Handles image zoom, hosted video (with custom Instagram-style controls),
6
+ YouTube/Vimeo embeds, and raw HTML in a fullscreen lightbox overlay.
7
7
  ========================================================================== */
8
8
 
9
9
  if (!customElements.get('rk-modal-element')) {
@@ -13,6 +13,7 @@ if (!customElements.get('rk-modal-element')) {
13
13
  this.modal = null;
14
14
  this.content = null;
15
15
  this.previousFocus = null;
16
+ this._raf = null;
16
17
 
17
18
  this._onKeyDown = this._onKeyDown.bind(this);
18
19
  }
@@ -25,6 +26,11 @@ if (!customElements.get('rk-modal-element')) {
25
26
 
26
27
  this._bindEvents();
27
28
  this._setupOpenTriggers();
29
+ this._setupVideoControls();
30
+ }
31
+
32
+ disconnectedCallback() {
33
+ if (this._raf) cancelAnimationFrame(this._raf);
28
34
  }
29
35
 
30
36
  /* ------------------------------------------------------------------ */
@@ -49,6 +55,132 @@ if (!customElements.get('rk-modal-element')) {
49
55
  });
50
56
  }
51
57
 
58
+ /* ------------------------------------------------------------------ */
59
+ /* Custom video controls (Instagram-style) */
60
+ /* ------------------------------------------------------------------ */
61
+
62
+ _setupVideoControls() {
63
+ const video = this.querySelector('.rk-modal__video');
64
+ if (!video) return;
65
+
66
+ this._video = video;
67
+ this._controls = this.querySelector('.rk-modal__controls');
68
+ this._progressBar = this.querySelector('.rk-modal__progress-bar');
69
+ this._progressTrack = this.querySelector('[data-ctrl="progress"]');
70
+ this._timeDisplay = this.querySelector('[data-ctrl="time"]');
71
+ this._playPauseBtn = this.querySelector('[data-ctrl="play-pause"]');
72
+ this._muteBtn = this.querySelector('[data-ctrl="mute"]');
73
+ this._tapOverlay = this.querySelector('[data-ctrl="tap"]');
74
+
75
+ // Play/pause button
76
+ if (this._playPauseBtn) {
77
+ this._playPauseBtn.addEventListener('click', (e) => {
78
+ e.stopPropagation();
79
+ this._togglePlay();
80
+ });
81
+ }
82
+
83
+ // Mute button
84
+ if (this._muteBtn) {
85
+ this._muteBtn.addEventListener('click', (e) => {
86
+ e.stopPropagation();
87
+ this._toggleMute();
88
+ });
89
+ }
90
+
91
+ // Tap overlay — toggle play/pause
92
+ if (this._tapOverlay) {
93
+ this._tapOverlay.addEventListener('click', (e) => {
94
+ e.stopPropagation();
95
+ this._togglePlay();
96
+ });
97
+ }
98
+
99
+ // Progress bar click — seek
100
+ if (this._progressTrack) {
101
+ this._progressTrack.addEventListener('click', (e) => {
102
+ e.stopPropagation();
103
+ this._seek(e);
104
+ });
105
+ }
106
+
107
+ // Sync UI with video state
108
+ video.addEventListener('play', () => this._syncPlayState());
109
+ video.addEventListener('pause', () => this._syncPlayState());
110
+ video.addEventListener('volumechange', () => this._syncMuteState());
111
+ }
112
+
113
+ _togglePlay() {
114
+ if (!this._video) return;
115
+ if (this._video.paused) {
116
+ this._video.play().catch(() => {});
117
+ } else {
118
+ this._video.pause();
119
+ }
120
+ }
121
+
122
+ _toggleMute() {
123
+ if (!this._video) return;
124
+ this._video.muted = !this._video.muted;
125
+ }
126
+
127
+ _seek(e) {
128
+ if (!this._video || !this._progressTrack) return;
129
+ const rect = this._progressTrack.getBoundingClientRect();
130
+ const ratio = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));
131
+ this._video.currentTime = ratio * this._video.duration;
132
+ }
133
+
134
+ _syncPlayState() {
135
+ if (!this._video || !this._controls) return;
136
+ const playing = !this._video.paused;
137
+ this._controls.classList.toggle('is-playing', playing);
138
+ this._controls.classList.toggle('is-paused', !playing);
139
+
140
+ if (playing) {
141
+ this._startProgressLoop();
142
+ } else {
143
+ this._stopProgressLoop();
144
+ }
145
+ }
146
+
147
+ _syncMuteState() {
148
+ if (!this._video || !this._controls) return;
149
+ this._controls.classList.toggle('is-muted', this._video.muted);
150
+ this._controls.classList.toggle('is-unmuted', !this._video.muted);
151
+ }
152
+
153
+ _startProgressLoop() {
154
+ const update = () => {
155
+ if (!this._video || this._video.paused) return;
156
+
157
+ const pct = (this._video.currentTime / this._video.duration) * 100 || 0;
158
+ if (this._progressBar) {
159
+ this._progressBar.style.width = pct + '%';
160
+ }
161
+
162
+ if (this._timeDisplay) {
163
+ this._timeDisplay.textContent = this._formatTime(this._video.currentTime);
164
+ }
165
+
166
+ this._raf = requestAnimationFrame(update);
167
+ };
168
+ this._raf = requestAnimationFrame(update);
169
+ }
170
+
171
+ _stopProgressLoop() {
172
+ if (this._raf) {
173
+ cancelAnimationFrame(this._raf);
174
+ this._raf = null;
175
+ }
176
+ }
177
+
178
+ _formatTime(seconds) {
179
+ const m = Math.floor(seconds / 60);
180
+ const s = Math.floor(seconds % 60);
181
+ return m + ':' + (s < 10 ? '0' : '') + s;
182
+ }
183
+
52
184
  /* ------------------------------------------------------------------ */
53
185
  /* Public API */
54
186
  /* ------------------------------------------------------------------ */
@@ -68,9 +200,13 @@ if (!customElements.get('rk-modal-element')) {
68
200
  // Load lazy iframes (YouTube/Vimeo)
69
201
  this._loadIframes();
70
202
 
71
- // Autoplay video if configured
72
- if (this.dataset.autoplay === 'true') {
73
- this._playMedia();
203
+ // Autoplay hosted video (muted)
204
+ this._playMedia();
205
+
206
+ // Sync initial state
207
+ if (this._video) {
208
+ this._syncPlayState();
209
+ this._syncMuteState();
74
210
  }
75
211
 
76
212
  // Focus close button
@@ -96,6 +232,7 @@ if (!customElements.get('rk-modal-element')) {
96
232
 
97
233
  // Stop all media
98
234
  this._stopMedia();
235
+ this._stopProgressLoop();
99
236
 
100
237
  if (this.previousFocus) {
101
238
  this.previousFocus.focus();
@@ -117,14 +254,7 @@ if (!customElements.get('rk-modal-element')) {
117
254
  _loadIframes() {
118
255
  this.querySelectorAll('iframe[data-src]').forEach((iframe) => {
119
256
  if (!iframe.src || iframe.src === 'about:blank') {
120
- const src = iframe.dataset.src;
121
- if (this.dataset.autoplay === 'true' && src.includes('youtube.com')) {
122
- iframe.src = src + (src.includes('?') ? '&' : '?') + 'autoplay=1';
123
- } else if (this.dataset.autoplay === 'true' && src.includes('vimeo.com')) {
124
- iframe.src = src + (src.includes('?') ? '&' : '?') + 'autoplay=1';
125
- } else {
126
- iframe.src = src;
127
- }
257
+ iframe.src = iframe.dataset.src;
128
258
  }
129
259
  });
130
260
  }
@@ -132,8 +262,10 @@ if (!customElements.get('rk-modal-element')) {
132
262
  _playMedia() {
133
263
  const video = this.querySelector('video[data-autoplay]');
134
264
  if (video) {
265
+ video.muted = true;
266
+ video.currentTime = 0;
135
267
  video.play().catch(() => {
136
- /* autoplay blocked by browser — silent fail */
268
+ /* autoplay blocked — silent fail */
137
269
  });
138
270
  }
139
271
  }
@@ -154,7 +286,7 @@ if (!customElements.get('rk-modal-element')) {
154
286
  }
155
287
 
156
288
  /* ------------------------------------------------------------------ */
157
- /* Keyboard (ESC) */
289
+ /* Keyboard (ESC + Space for play/pause) */
158
290
  /* ------------------------------------------------------------------ */
159
291
 
160
292
  _onKeyDown(e) {
@@ -163,6 +295,20 @@ if (!customElements.get('rk-modal-element')) {
163
295
  if (e.key === 'Escape') {
164
296
  e.preventDefault();
165
297
  this.close();
298
+ return;
299
+ }
300
+
301
+ // Space toggles play/pause on video
302
+ if (e.key === ' ' && this._video) {
303
+ e.preventDefault();
304
+ this._togglePlay();
305
+ return;
306
+ }
307
+
308
+ // M toggles mute on video
309
+ if (e.key === 'm' && this._video) {
310
+ e.preventDefault();
311
+ this._toggleMute();
166
312
  }
167
313
  }
168
314
  }
@@ -2,6 +2,7 @@
2
2
  Snippet: RkModal
3
3
  Renders a media lightbox for images, videos, and embedded content.
4
4
  Uses Web Component <rk-modal-element> for behaviour.
5
+ Videos use custom Instagram-style controls (autoplay + muted by default).
5
6
 
6
7
  @param {string} id - Unique modal id (required)
7
8
  @param {string} [type] - 'image' | 'video' | 'youtube' | 'vimeo' | 'html' (default: 'image')
@@ -12,7 +13,6 @@
12
13
  @param {string} [content] - Raw HTML content (when type is 'html')
13
14
  @param {string} [alt] - Alt text for images / aria-label for media
14
15
  @param {string} [aspect_ratio] - Aspect ratio for video (e.g. '16/9', default: '16/9')
15
- @param {boolean} [autoplay] - Autoplay video on open (default: true)
16
16
  @param {string} [custom_class] - Extra CSS classes
17
17
 
18
18
  @example — Image lightbox
@@ -28,14 +28,12 @@
28
28
  {%- liquid
29
29
  assign modal_type = type | default: 'image'
30
30
  assign modal_aspect = aspect_ratio | default: '16/9'
31
- assign modal_autoplay = autoplay | default: true
32
31
  assign modal_alt = alt | default: ''
33
32
  -%}
34
33
 
35
34
  <rk-modal-element
36
35
  data-modal-id="{{ id }}"
37
36
  data-type="{{ modal_type }}"
38
- {% if modal_autoplay %}data-autoplay="true"{% endif %}
39
37
  >
40
38
  <div id="{{ id }}" class="rk-modal{% if custom_class %} {{ custom_class }}{% endif %}">
41
39
  {%- comment -%} Overlay {%- endcomment -%}
@@ -75,21 +73,52 @@
75
73
  <div class="rk-modal__media rk-modal__media--video" style="aspect-ratio: {{ modal_aspect }};">
76
74
  <video
77
75
  class="rk-modal__video"
78
- controls
79
76
  playsinline
77
+ muted
78
+ loop
80
79
  preload="metadata"
81
- {% if modal_autoplay %}data-autoplay{% endif %}
80
+ data-autoplay
82
81
  {% if modal_alt != blank %}aria-label="{{ modal_alt }}"{% endif %}
83
82
  >
84
83
  <source src="{{ video_url }}" type="video/mp4">
85
84
  </video>
85
+
86
+ {%- comment -%} Custom controls — Instagram style {%- endcomment -%}
87
+ <div class="rk-modal__controls">
88
+ <button type="button" class="rk-modal__ctrl-btn" data-ctrl="play-pause" aria-label="Play / Pause">
89
+ <svg class="rk-modal__ctrl-icon rk-modal__ctrl-icon--play" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
90
+ <path d="M6.3 3.24A1 1 0 0 0 5 4.13v11.74a1 1 0 0 0 1.5.87l10-5.87a1 1 0 0 0 0-1.74l-10-5.87-.2-.02Z"/>
91
+ </svg>
92
+ <svg class="rk-modal__ctrl-icon rk-modal__ctrl-icon--pause" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
93
+ <path d="M5 3h3v14H5V3Zm7 0h3v14h-3V3Z"/>
94
+ </svg>
95
+ </button>
96
+
97
+ <div class="rk-modal__progress" data-ctrl="progress">
98
+ <div class="rk-modal__progress-bar"></div>
99
+ </div>
100
+
101
+ <span class="rk-modal__time" data-ctrl="time">0:00</span>
102
+
103
+ <button type="button" class="rk-modal__ctrl-btn" data-ctrl="mute" aria-label="Mudo / Som">
104
+ <svg class="rk-modal__ctrl-icon rk-modal__ctrl-icon--muted" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
105
+ <path d="M10 3.5a.5.5 0 0 0-.8-.4L5.38 6H2.5a.5.5 0 0 0-.5.5v7a.5.5 0 0 0 .5.5h2.88l3.82 2.9a.5.5 0 0 0 .8-.4v-13ZM14.15 6.15a.5.5 0 0 1 .7 0l1.65 1.65 1.65-1.65a.5.5 0 0 1 .7.7L17.2 8.5l1.65 1.65a.5.5 0 0 1-.7.7L16.5 9.2l-1.65 1.65a.5.5 0 0 1-.7-.7l1.65-1.65-1.65-1.65a.5.5 0 0 1 0-.7Z"/>
106
+ </svg>
107
+ <svg class="rk-modal__ctrl-icon rk-modal__ctrl-icon--unmuted" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
108
+ <path d="M10 3.5a.5.5 0 0 0-.8-.4L5.38 6H2.5a.5.5 0 0 0-.5.5v7a.5.5 0 0 0 .5.5h2.88l3.82 2.9a.5.5 0 0 0 .8-.4v-13ZM13.54 6.16a.5.5 0 0 1 .7 0A6.47 6.47 0 0 1 16 10.5a6.47 6.47 0 0 1-1.76 4.34.5.5 0 0 1-.7-.7A5.47 5.47 0 0 0 15 10.5c0-1.5-.52-2.88-1.46-3.64a.5.5 0 0 1 0-.7Zm-1.08 2.3a.5.5 0 0 1 .7 0c.55.5.84 1.24.84 2.04s-.29 1.54-.84 2.04a.5.5 0 0 1-.7-.7c.35-.32.54-.79.54-1.34s-.19-1.02-.54-1.34a.5.5 0 0 1 0-.7Z"/>
109
+ </svg>
110
+ </button>
111
+ </div>
112
+
113
+ {%- comment -%} Tap-to-toggle play overlay {%- endcomment -%}
114
+ <div class="rk-modal__tap-overlay" data-ctrl="tap"></div>
86
115
  </div>
87
116
 
88
117
  {%- when 'youtube' -%}
89
118
  <div class="rk-modal__media rk-modal__media--embed" style="aspect-ratio: {{ modal_aspect }};">
90
119
  <iframe
91
120
  class="rk-modal__iframe"
92
- data-src="https://www.youtube.com/embed/{{ youtube_id }}?rel=0&enablejsapi=1"
121
+ data-src="https://www.youtube.com/embed/{{ youtube_id }}?rel=0&enablejsapi=1&mute=1&autoplay=1"
93
122
  allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
94
123
  allowfullscreen
95
124
  loading="lazy"
@@ -101,7 +130,7 @@
101
130
  <div class="rk-modal__media rk-modal__media--embed" style="aspect-ratio: {{ modal_aspect }};">
102
131
  <iframe
103
132
  class="rk-modal__iframe"
104
- data-src="https://player.vimeo.com/video/{{ vimeo_id }}?title=0&byline=0&portrait=0"
133
+ data-src="https://player.vimeo.com/video/{{ vimeo_id }}?title=0&byline=0&portrait=0&muted=1&autoplay=1"
105
134
  allow="autoplay; fullscreen; picture-in-picture"
106
135
  allowfullscreen
107
136
  loading="lazy"
package/src/app.js CHANGED
@@ -41,22 +41,26 @@ export class App {
41
41
  this.conflictResolver = new ConflictResolver(this.logger);
42
42
  this.fileMapper = new FileMapper(this.logger, this.conflictResolver);
43
43
 
44
+ // -- Serviços --
45
+ this.scaffoldService = new ScaffoldService(this.logger);
46
+ this.frameworkInstaller = new FrameworkInstaller(this.logger);
47
+
44
48
  // -- Comandos --
45
- this.addCommand = new AddCommand(
49
+ this.installCommand = new InstallCommand(
46
50
  this.logger,
47
51
  this.promptUI,
48
- this.githubService,
49
- this.downloadService,
50
- this.fileMapper
52
+ this.frameworkInstaller
51
53
  );
52
54
 
53
- this.configCommand = new ConfigCommand(
55
+ this.addCommand = new AddCommand(
54
56
  this.logger,
55
- this.tokenManager
57
+ this.promptUI,
58
+ this.githubService,
59
+ this.downloadService,
60
+ this.fileMapper,
61
+ this.installCommand
56
62
  );
57
63
 
58
- this.scaffoldService = new ScaffoldService(this.logger);
59
-
60
64
  this.generateCommand = new GenerateCommand(
61
65
  this.logger,
62
66
  this.promptUI,
@@ -64,12 +68,9 @@ export class App {
64
68
  this.conflictResolver
65
69
  );
66
70
 
67
- this.frameworkInstaller = new FrameworkInstaller(this.logger);
68
-
69
- this.installCommand = new InstallCommand(
71
+ this.configCommand = new ConfigCommand(
70
72
  this.logger,
71
- this.promptUI,
72
- this.frameworkInstaller
73
+ this.tokenManager
73
74
  );
74
75
  }
75
76
 
@@ -24,13 +24,15 @@ export class AddCommand {
24
24
  * @param {import('../services/GitHubService.js').GitHubService} githubService
25
25
  * @param {import('../services/DownloadService.js').DownloadService} downloadService
26
26
  * @param {import('../filesystem/FileMapper.js').FileMapper} fileMapper
27
+ * @param {import('./InstallCommand.js').InstallCommand} installCommand
27
28
  */
28
- constructor(logger, promptUI, githubService, downloadService, fileMapper) {
29
+ constructor(logger, promptUI, githubService, downloadService, fileMapper, installCommand) {
29
30
  this.logger = logger;
30
31
  this.promptUI = promptUI;
31
32
  this.githubService = githubService;
32
33
  this.downloadService = downloadService;
33
34
  this.fileMapper = fileMapper;
35
+ this.installCommand = installCommand;
34
36
  }
35
37
 
36
38
  /**
@@ -57,7 +59,9 @@ export class AddCommand {
57
59
  const tipoInstalacao = opcoes.type || await this.promptUI.menuPrincipal();
58
60
 
59
61
  // 2. Delega para o fluxo correto
60
- if (tipoInstalacao === 'kit') {
62
+ if (tipoInstalacao === 'framework') {
63
+ await this.installCommand.executar();
64
+ } else if (tipoInstalacao === 'kit') {
61
65
  await this._instalarKit(opcoes.name);
62
66
  } else {
63
67
  await this._instalarComponentes(opcoes.name);
@@ -74,6 +74,11 @@ export class PromptUI {
74
74
  const escolha = await select({
75
75
  message: 'O que você deseja instalar?',
76
76
  choices: [
77
+ {
78
+ name: '⚡ Rook UI Framework — Instala o core framework no tema',
79
+ value: 'framework',
80
+ description: 'Tokens, variáveis, estilos base e snippets do framework',
81
+ },
77
82
  {
78
83
  name: '🎯 Kit Base — Estrutura completa para iniciar projetos',
79
84
  value: 'kit',
@@ -47,11 +47,19 @@ export class Logger {
47
47
  * Exibe o banner/header do CLI.
48
48
  */
49
49
  banner() {
50
+ const dim = pc.dim;
51
+ const bold = pc.bold;
52
+ const white = pc.white;
53
+
54
+ console.log('');
55
+ console.log(bold(white(' ██████╗ ██████╗ ██████╗ ██╗ ██╗')));
56
+ console.log(bold(white(' ██╔══██╗██╔═══██╗██╔═══██╗██║ ██╔╝')));
57
+ console.log(bold(white(' ██████╔╝██║ ██║██║ ██║█████╔╝ ')));
58
+ console.log(bold(white(' ██╔══██╗██║ ██║██║ ██║██╔═██╗ ')));
59
+ console.log(bold(white(' ██║ ██║╚██████╔╝╚██████╔╝██║ ██╗')));
60
+ console.log(bold(white(' ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝')));
50
61
  console.log('');
51
- console.log(pc.bold(pc.white(' ╔══════════════════════════════╗')));
52
- console.log(pc.bold(pc.white(' ║ ♟️ ROOK CLI v1.3.9 ║')));
53
- console.log(pc.bold(pc.white(' ║ Shopify Component Tool ║')));
54
- console.log(pc.bold(pc.white(' ╚══════════════════════════════╝')));
62
+ console.log(dim(' v1.3.11 — Shopify Component Tool'));
55
63
  console.log('');
56
64
  }
57
65