create-nativecore 0.1.1 → 0.2.0

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 (175) hide show
  1. package/README.md +6 -14
  2. package/bin/index.mjs +402 -431
  3. package/package.json +3 -2
  4. package/template/.env.example +28 -0
  5. package/template/.htmlhintrc +14 -0
  6. package/template/api/data/dashboard.json +11 -0
  7. package/template/api/data/users.json +18 -0
  8. package/template/api/mockApi.js +161 -0
  9. package/template/assets/icon.svg +13 -0
  10. package/template/assets/logo.svg +25 -0
  11. package/template/eslint.config.js +94 -0
  12. package/template/index.html +137 -0
  13. package/template/manifest.json +19 -0
  14. package/template/public/.well-known/security.txt +9 -0
  15. package/template/public/_headers +24 -0
  16. package/template/public/_redirects +14 -0
  17. package/template/public/assets/icon.svg +13 -0
  18. package/template/public/assets/logo.svg +25 -0
  19. package/template/public/manifest.json +19 -0
  20. package/template/public/robots.txt +13 -0
  21. package/template/public/sitemap.xml +27 -0
  22. package/template/scripts/build-for-bots.mjs +121 -0
  23. package/template/scripts/convert-to-ts.mjs +106 -0
  24. package/template/scripts/fix-encoding.mjs +38 -0
  25. package/template/scripts/fix-svg-paths.mjs +32 -0
  26. package/template/scripts/generate-cf-router.mjs +52 -0
  27. package/template/scripts/inject-dev-tools.mjs +41 -0
  28. package/template/scripts/inject-version.mjs +65 -0
  29. package/template/scripts/make-component.mjs +445 -0
  30. package/template/scripts/make-component.mjs.backup +432 -0
  31. package/template/scripts/make-controller.mjs +119 -0
  32. package/template/scripts/make-core-component.mjs +303 -0
  33. package/template/scripts/make-view.mjs +346 -0
  34. package/template/scripts/minify.mjs +71 -0
  35. package/template/scripts/prepare-static-assets.mjs +141 -0
  36. package/template/scripts/prompt-bot-build.mjs +223 -0
  37. package/template/scripts/remove-component.mjs +170 -0
  38. package/template/scripts/remove-core-component.mjs +156 -0
  39. package/template/scripts/remove-dev.mjs +13 -0
  40. package/template/scripts/remove-view.mjs +200 -0
  41. package/template/scripts/strip-dev-blocks.mjs +30 -0
  42. package/template/scripts/watch-compile.mjs +69 -0
  43. package/template/server.js +1066 -0
  44. package/template/src/app.ts +115 -0
  45. package/template/src/components/appRegistry.ts +8 -0
  46. package/template/src/components/core/app-footer.ts +27 -0
  47. package/template/src/components/core/app-header.ts +175 -0
  48. package/template/src/components/core/app-sidebar.ts +238 -0
  49. package/template/src/components/core/loading-spinner.ts +25 -0
  50. package/template/src/components/core/nc-a.ts +313 -0
  51. package/template/src/components/core/nc-accordion.ts +186 -0
  52. package/template/src/components/core/nc-alert.ts +153 -0
  53. package/template/src/components/core/nc-animation.ts +1150 -0
  54. package/template/src/components/core/nc-autocomplete.ts +271 -0
  55. package/template/src/components/core/nc-avatar-group.ts +113 -0
  56. package/template/src/components/core/nc-avatar.ts +148 -0
  57. package/template/src/components/core/nc-badge.ts +86 -0
  58. package/template/src/components/core/nc-bottom-nav.ts +214 -0
  59. package/template/src/components/core/nc-breadcrumb.ts +96 -0
  60. package/template/src/components/core/nc-button.ts +307 -0
  61. package/template/src/components/core/nc-card.ts +160 -0
  62. package/template/src/components/core/nc-checkbox.ts +282 -0
  63. package/template/src/components/core/nc-chip.ts +115 -0
  64. package/template/src/components/core/nc-code.ts +314 -0
  65. package/template/src/components/core/nc-collapsible.ts +154 -0
  66. package/template/src/components/core/nc-color-picker.ts +268 -0
  67. package/template/src/components/core/nc-copy-button.ts +119 -0
  68. package/template/src/components/core/nc-date-picker.ts +443 -0
  69. package/template/src/components/core/nc-div.ts +280 -0
  70. package/template/src/components/core/nc-divider.ts +81 -0
  71. package/template/src/components/core/nc-drawer.ts +230 -0
  72. package/template/src/components/core/nc-dropdown.ts +178 -0
  73. package/template/src/components/core/nc-empty-state.ts +134 -0
  74. package/template/src/components/core/nc-file-upload.ts +354 -0
  75. package/template/src/components/core/nc-form.ts +312 -0
  76. package/template/src/components/core/nc-image.ts +184 -0
  77. package/template/src/components/core/nc-input.ts +383 -0
  78. package/template/src/components/core/nc-kbd.ts +48 -0
  79. package/template/src/components/core/nc-menu-item.ts +193 -0
  80. package/template/src/components/core/nc-menu.ts +376 -0
  81. package/template/src/components/core/nc-modal.ts +238 -0
  82. package/template/src/components/core/nc-nav-item.ts +151 -0
  83. package/template/src/components/core/nc-number-input.ts +350 -0
  84. package/template/src/components/core/nc-otp-input.ts +235 -0
  85. package/template/src/components/core/nc-pagination.ts +178 -0
  86. package/template/src/components/core/nc-popover.ts +260 -0
  87. package/template/src/components/core/nc-progress-circular.ts +119 -0
  88. package/template/src/components/core/nc-progress.ts +134 -0
  89. package/template/src/components/core/nc-radio.ts +235 -0
  90. package/template/src/components/core/nc-rating.ts +266 -0
  91. package/template/src/components/core/nc-rich-text.ts +283 -0
  92. package/template/src/components/core/nc-scroll-top.ts +116 -0
  93. package/template/src/components/core/nc-select.ts +452 -0
  94. package/template/src/components/core/nc-skeleton.ts +107 -0
  95. package/template/src/components/core/nc-slider.ts +285 -0
  96. package/template/src/components/core/nc-snackbar.ts +230 -0
  97. package/template/src/components/core/nc-splash.ts +343 -0
  98. package/template/src/components/core/nc-stepper.ts +247 -0
  99. package/template/src/components/core/nc-switch.ts +281 -0
  100. package/template/src/components/core/nc-tab-item.ts +138 -0
  101. package/template/src/components/core/nc-table.ts +279 -0
  102. package/template/src/components/core/nc-tabs.ts +554 -0
  103. package/template/src/components/core/nc-tag-input.ts +279 -0
  104. package/template/src/components/core/nc-textarea.ts +216 -0
  105. package/template/src/components/core/nc-time-picker.ts +438 -0
  106. package/template/src/components/core/nc-timeline.ts +186 -0
  107. package/template/src/components/core/nc-tooltip.ts +143 -0
  108. package/template/src/components/frameworkRegistry.ts +68 -0
  109. package/template/src/components/preloadRegistry.ts +28 -0
  110. package/template/src/components/registry.ts +8 -0
  111. package/template/src/components/ui/dashboard-signal-lab.ts +284 -0
  112. package/template/src/constants/apiEndpoints.ts +27 -0
  113. package/template/src/constants/errorMessages.ts +23 -0
  114. package/template/src/constants/index.ts +8 -0
  115. package/template/src/constants/routePaths.ts +15 -0
  116. package/template/src/constants/storageKeys.ts +18 -0
  117. package/template/src/controllers/dashboard.controller.ts +200 -0
  118. package/template/src/controllers/home.controller.ts +21 -0
  119. package/template/src/controllers/index.ts +11 -0
  120. package/template/src/controllers/login.controller.ts +131 -0
  121. package/template/src/core/component.ts +354 -0
  122. package/template/src/core/errorHandler.ts +85 -0
  123. package/template/src/core/gpu-animation.ts +604 -0
  124. package/template/src/core/http.ts +173 -0
  125. package/template/src/core/lazyComponents.ts +90 -0
  126. package/template/src/core/router.ts +642 -0
  127. package/template/src/core/signals.ts +146 -0
  128. package/template/src/core/state.ts +248 -0
  129. package/template/src/dev/component-editor.ts +1363 -0
  130. package/template/src/dev/component-overlay.ts +278 -0
  131. package/template/src/dev/context-menu.ts +223 -0
  132. package/template/src/dev/denc-tools.ts +250 -0
  133. package/template/src/dev/hmr.ts +189 -0
  134. package/template/src/dev/nfbs.code-workspace +27 -0
  135. package/template/src/dev/outline-panel.ts +1247 -0
  136. package/template/src/middleware/auth.middleware.ts +23 -0
  137. package/template/src/routes/routes.ts +38 -0
  138. package/template/src/services/api.service.ts +394 -0
  139. package/template/src/services/auth.service.ts +176 -0
  140. package/template/src/services/index.ts +8 -0
  141. package/template/src/services/logger.service.ts +74 -0
  142. package/template/src/services/storage.service.ts +88 -0
  143. package/template/src/stores/appStore.ts +57 -0
  144. package/template/src/stores/uiStore.ts +36 -0
  145. package/template/src/styles/core-variables.css +219 -0
  146. package/template/src/styles/core.css +710 -0
  147. package/template/src/styles/main.css +3164 -0
  148. package/template/src/styles/variables.css +152 -0
  149. package/template/src/types/global.d.ts +47 -0
  150. package/template/src/utils/cacheBuster.ts +20 -0
  151. package/template/src/utils/dom.ts +149 -0
  152. package/template/src/utils/events.ts +203 -0
  153. package/template/src/utils/form.ts +176 -0
  154. package/template/src/utils/formatters.ts +169 -0
  155. package/template/src/utils/helpers.ts +195 -0
  156. package/template/src/utils/markdown.ts +307 -0
  157. package/template/src/utils/sidebar.ts +96 -0
  158. package/template/src/utils/smoothScroll.ts +85 -0
  159. package/template/src/utils/templates.ts +23 -0
  160. package/template/src/utils/validation.ts +73 -0
  161. package/template/src/views/protected/dashboard.html +293 -0
  162. package/template/src/views/public/home.html +150 -0
  163. package/template/src/views/public/login.html +102 -0
  164. package/template/tests/unit/component.test.ts +87 -0
  165. package/template/tests/unit/computed.test.ts +79 -0
  166. package/template/tests/unit/form.test.ts +68 -0
  167. package/template/tests/unit/formatters.test.ts +49 -0
  168. package/template/tests/unit/lazy-components.test.ts +59 -0
  169. package/template/tests/unit/markdown.test.ts +62 -0
  170. package/template/tests/unit/router.test.ts +112 -0
  171. package/template/tests/unit/signals.test.ts +54 -0
  172. package/template/tests/unit/validation.test.ts +50 -0
  173. package/template/tsconfig.build.json +21 -0
  174. package/template/tsconfig.json +51 -0
  175. package/template/vitest.config.ts +36 -0
@@ -0,0 +1,293 @@
1
+ <div class="dashboard-container">
2
+ <nc-animation name="fade-in" trigger="mount" duration="420">
3
+ <nc-card variant="secondary" class="dashboard-hero">
4
+ <div class="dashboard-hero__content">
5
+ <nc-chip variant="success" size="sm">Protected Product Demo</nc-chip>
6
+ <h1 class="dashboard-title">NativeCore workspace</h1>
7
+ <p id="welcome-message" class="dashboard-subtitle">A polished dashboard that proves routing, state, components, and motion can all coexist without framework sprawl.</p>
8
+
9
+ <div class="dashboard-hero__actions">
10
+ <nc-tooltip tip="Reload the authenticated dashboard metrics">
11
+ <nc-button id="refreshBtn" variant="primary" size="lg">Refresh metrics</nc-button>
12
+ </nc-tooltip>
13
+ <nc-badge count="4" variant="info">
14
+ <nc-a href="/docs" variant="outline">Open docs</nc-a>
15
+ </nc-badge>
16
+ </div>
17
+
18
+ <div class="dashboard-hero__proofs">
19
+ <nc-chip variant="primary" size="sm">Protected route</nc-chip>
20
+ <nc-chip variant="default" size="sm">Lazy controllers</nc-chip>
21
+ <nc-chip variant="success" size="sm">Signals + computed</nc-chip>
22
+ <nc-chip variant="warning" size="sm">Core component system</nc-chip>
23
+ </div>
24
+ </div>
25
+
26
+ <div class="dashboard-hero__spotlight">
27
+ <nc-card class="dashboard-spotlight-card">
28
+ <nc-popover placement="bottom-start">
29
+ <nc-button slot="trigger" variant="ghost" size="sm">Framework health</nc-button>
30
+ <div class="dashboard-popover-copy">
31
+ A derived score calculated from authenticated users, active sessions, and revenue readiness to explain the dashboard story in one number.
32
+ </div>
33
+ </nc-popover>
34
+ <strong id="dashboard-overview-score" class="dashboard-spotlight-card__value">0%</strong>
35
+ <p class="dashboard-spotlight-card__copy">Derived from authenticated metrics, active sessions, and delivery readiness.</p>
36
+ </nc-card>
37
+
38
+ <nc-alert variant="success" title="Ready for walkthroughs">
39
+ The protected experience now demonstrates real login, stable routing, responsive shell behavior, and component-led UI composition.
40
+ </nc-alert>
41
+ </div>
42
+ </nc-card>
43
+ </nc-animation>
44
+
45
+ <section class="dashboard-kpi-grid" id="dashboard-stats">
46
+ <nc-animation name="slide-up" trigger="visible" duration="420">
47
+ <nc-card variant="secondary" class="dashboard-kpi-card">
48
+ <div>
49
+ <nc-chip variant="default" size="sm">Authenticated users</nc-chip>
50
+ <strong id="stat-users" class="dashboard-kpi-card__value">0</strong>
51
+ <p class="dashboard-kpi-card__copy">Live payload returned through the API service after remote-auth login.</p>
52
+ </div>
53
+ <nc-progress-circular id="stat-users-ring" size="82" thickness="7" variant="success" show-value value="0"></nc-progress-circular>
54
+ </nc-card>
55
+ </nc-animation>
56
+
57
+ <nc-animation name="slide-up" trigger="visible" duration="420" delay="80">
58
+ <nc-card variant="secondary" class="dashboard-kpi-card">
59
+ <div>
60
+ <nc-chip variant="default" size="sm">Active sessions</nc-chip>
61
+ <strong id="stat-sessions" class="dashboard-kpi-card__value">0</strong>
62
+ <p class="dashboard-kpi-card__copy">Shows protected-shell activity and validates post-login token usage.</p>
63
+ </div>
64
+ <nc-progress-circular id="stat-sessions-ring" size="82" thickness="7" variant="primary" show-value value="0"></nc-progress-circular>
65
+ </nc-card>
66
+ </nc-animation>
67
+
68
+ <nc-animation name="slide-up" trigger="visible" duration="420" delay="160">
69
+ <nc-card variant="secondary" class="dashboard-kpi-card">
70
+ <div>
71
+ <nc-chip variant="default" size="sm">Revenue pipeline</nc-chip>
72
+ <strong id="stat-revenue" class="dashboard-kpi-card__value">$0</strong>
73
+ <p class="dashboard-kpi-card__copy">Presented as business context instead of raw demo filler.</p>
74
+ </div>
75
+ <nc-progress-circular id="stat-revenue-ring" size="82" thickness="7" variant="warning" show-value value="0"></nc-progress-circular>
76
+ </nc-card>
77
+ </nc-animation>
78
+
79
+ <nc-animation name="slide-up" trigger="visible" duration="420" delay="240">
80
+ <nc-card variant="secondary" class="dashboard-kpi-card">
81
+ <div>
82
+ <nc-chip variant="default" size="sm">New today</nc-chip>
83
+ <strong id="stat-new-today" class="dashboard-kpi-card__value">0</strong>
84
+ <p class="dashboard-kpi-card__copy">Useful for real-time extensions, notifications, and activity surfaces.</p>
85
+ </div>
86
+ <nc-progress-circular id="stat-new-today-ring" size="82" thickness="7" variant="danger" show-value value="0"></nc-progress-circular>
87
+ </nc-card>
88
+ </nc-animation>
89
+ </section>
90
+
91
+ <section class="dashboard-main-grid">
92
+ <nc-animation name="slide-up" trigger="visible" duration="420">
93
+ <nc-card variant="secondary" class="dashboard-panel dashboard-panel--wide">
94
+ <div class="dashboard-panel__header">
95
+ <div>
96
+ <nc-chip variant="success" size="sm">Operational Story</nc-chip>
97
+ <h2 class="dashboard-panel__title">A cleaner view of delivery health</h2>
98
+ </div>
99
+ <nc-chip id="delivery-summary" variant="neutral" size="sm">Loading metrics...</nc-chip>
100
+ </div>
101
+
102
+ <nc-divider></nc-divider>
103
+
104
+ <div class="dashboard-health-list">
105
+ <div class="dashboard-health-row">
106
+ <div>
107
+ <strong>Adoption confidence</strong>
108
+ <span>Measures authenticated usage against the current demo target.</span>
109
+ </div>
110
+ <nc-progress id="health-adoption" size="md" variant="success" show-value></nc-progress>
111
+ </div>
112
+
113
+ <div class="dashboard-health-row">
114
+ <div>
115
+ <strong>Session durability</strong>
116
+ <span>Shows whether protected route access stays active after sign-in and navigation.</span>
117
+ </div>
118
+ <nc-progress id="health-sessions" size="md" variant="primary" striped animated show-value></nc-progress>
119
+ </div>
120
+
121
+ <div class="dashboard-health-row">
122
+ <div>
123
+ <strong>Revenue instrumentation</strong>
124
+ <span>Turns business metrics into a presentable operations summary for demos.</span>
125
+ </div>
126
+ <nc-progress id="health-revenue" size="md" variant="warning" show-value></nc-progress>
127
+ </div>
128
+ </div>
129
+ </nc-card>
130
+ </nc-animation>
131
+
132
+ <nc-animation name="slide-up" trigger="visible" duration="420" delay="120">
133
+ <nc-card variant="secondary" class="dashboard-panel">
134
+ <div class="dashboard-panel__header">
135
+ <div>
136
+ <nc-chip variant="primary" size="sm">Activity Timeline</nc-chip>
137
+ <h2 class="dashboard-panel__title">Recent protected-shell events</h2>
138
+ </div>
139
+ <nc-badge count="3" id="activity-count-badge" variant="info">
140
+ <nc-chip variant="neutral" size="sm">Recent events</nc-chip>
141
+ </nc-badge>
142
+ </div>
143
+
144
+ <nc-divider></nc-divider>
145
+
146
+ <nc-timeline id="dashboard-activity-timeline"></nc-timeline>
147
+ </nc-card>
148
+ </nc-animation>
149
+ </section>
150
+
151
+ <nc-animation name="slide-up" trigger="visible" duration="420" delay="180">
152
+ <nc-card variant="secondary" class="dashboard-panel dashboard-panel--showcase">
153
+ <div class="dashboard-panel__header">
154
+ <div>
155
+ <nc-chip variant="warning" size="sm">Framework Showcase</nc-chip>
156
+ <h2 class="dashboard-panel__title">Core primitives, state, and animation in one view</h2>
157
+ </div>
158
+ </div>
159
+
160
+ <nc-tabs variant="pills" transition="fade">
161
+ <nc-tab-item label="Signals + computed">
162
+ <div class="dashboard-showcase-grid">
163
+ <nc-card variant="secondary" class="dashboard-panel dashboard-signal-lab-card">
164
+ <div class="dashboard-panel__header dashboard-panel__header--compact">
165
+ <div>
166
+ <nc-chip variant="success" size="sm">Live Signals</nc-chip>
167
+ <h3 class="dashboard-panel__title dashboard-panel__title--small">useState + computed without view-layer rerenders</h3>
168
+ </div>
169
+ <nc-badge count="2" variant="success">
170
+ <nc-chip variant="neutral" size="sm">Derived values</nc-chip>
171
+ </nc-badge>
172
+ </div>
173
+
174
+ <div class="dashboard-signal-lab-grid">
175
+ <nc-card variant="secondary" class="dashboard-metric-card">
176
+ <nc-chip variant="default" size="sm">Completed</nc-chip>
177
+ <strong id="signal-completed" class="dashboard-metric-card__value">14</strong>
178
+ </nc-card>
179
+
180
+ <nc-card variant="secondary" class="dashboard-metric-card">
181
+ <nc-chip variant="default" size="sm">Remaining</nc-chip>
182
+ <strong id="signal-remaining" class="dashboard-metric-card__value">4</strong>
183
+ </nc-card>
184
+
185
+ <nc-card variant="secondary" class="dashboard-metric-card">
186
+ <nc-chip variant="default" size="sm">Completion</nc-chip>
187
+ <strong id="signal-completion" class="dashboard-metric-card__value">78%</strong>
188
+ </nc-card>
189
+ </div>
190
+
191
+ <nc-progress id="signal-progress" size="lg" variant="success" show-value value="78"></nc-progress>
192
+ <nc-alert id="signal-status" variant="success" title="On track">Computed delivery status updates from local dashboard state.</nc-alert>
193
+
194
+ <div class="dashboard-hero__actions">
195
+ <nc-button id="signal-complete-btn" variant="primary">Complete item</nc-button>
196
+ <nc-button id="signal-add-btn" variant="secondary">Add scope</nc-button>
197
+ <nc-button id="signal-reset-btn" variant="ghost">Reset demo</nc-button>
198
+ </div>
199
+ </nc-card>
200
+
201
+ <div class="dashboard-content-stack">
202
+ <nc-card variant="secondary" class="dashboard-note-card">
203
+ <h3>Why this matters</h3>
204
+ <p>`useState()` handles local mutations, `computed()` derives business state, and the controller wires subscriptions directly into the dashboard view.</p>
205
+ </nc-card>
206
+ <nc-code language="typescript" label="dashboard-signal-lab.ts" highlight="1,2,3">const completed = useState(14);
207
+ const total = useState(18);
208
+ const completion = computed(() =&gt; Math.round((completed.value / total.value) * 100));</nc-code>
209
+ </div>
210
+ </div>
211
+ </nc-tab-item>
212
+
213
+ <nc-tab-item label="Core components">
214
+ <div class="dashboard-component-grid">
215
+ <nc-animation name="scale-in" trigger="visible" duration="360">
216
+ <nc-card variant="secondary" class="dashboard-component-card">
217
+ <nc-chip variant="success" size="sm">nc-progress</nc-chip>
218
+ <h3>Operational gauges</h3>
219
+ <p>Progress bars make status changes legible without custom charting overhead.</p>
220
+ </nc-card>
221
+ </nc-animation>
222
+
223
+ <nc-animation name="scale-in" trigger="visible" duration="360" delay="80">
224
+ <nc-card variant="secondary" class="dashboard-component-card">
225
+ <nc-chip variant="primary" size="sm">nc-tabs</nc-chip>
226
+ <h3>Information density</h3>
227
+ <p>Tabs keep the dashboard tight while still proving component composition.</p>
228
+ </nc-card>
229
+ </nc-animation>
230
+
231
+ <nc-animation name="scale-in" trigger="visible" duration="360" delay="160">
232
+ <nc-card variant="secondary" class="dashboard-component-card">
233
+ <nc-chip variant="warning" size="sm">nc-timeline</nc-chip>
234
+ <h3>Event storytelling</h3>
235
+ <p>Timeline items turn backend activity into a digestible product narrative.</p>
236
+ </nc-card>
237
+ </nc-animation>
238
+
239
+ <nc-animation name="scale-in" trigger="visible" duration="360" delay="240">
240
+ <nc-card variant="secondary" class="dashboard-component-card">
241
+ <nc-chip variant="danger" size="sm">nc-animation</nc-chip>
242
+ <h3>Intentional motion</h3>
243
+ <p>Visible-trigger animations make the interface feel premium without adding chaos.</p>
244
+ </nc-card>
245
+ </nc-animation>
246
+ </div>
247
+ </nc-tab-item>
248
+
249
+ <nc-tab-item label="Data surfaces">
250
+ <div class="dashboard-data-grid">
251
+ <nc-card variant="secondary" class="dashboard-panel dashboard-panel--embedded">
252
+ <div class="dashboard-panel__header dashboard-panel__header--compact">
253
+ <div>
254
+ <nc-chip variant="info" size="sm">nc-table</nc-chip>
255
+ <h3 class="dashboard-panel__title dashboard-panel__title--small">Metric snapshot</h3>
256
+ </div>
257
+ </div>
258
+ <nc-table id="dashboard-metrics-table" striped compact sortable max-height="320px"></nc-table>
259
+ </nc-card>
260
+
261
+ <div class="dashboard-content-stack">
262
+ <nc-card variant="secondary" class="dashboard-panel dashboard-panel--embedded">
263
+ <div class="dashboard-panel__header dashboard-panel__header--compact">
264
+ <div>
265
+ <nc-chip variant="warning" size="sm">nc-accordion</nc-chip>
266
+ <h3 class="dashboard-panel__title dashboard-panel__title--small">Implementation notes</h3>
267
+ </div>
268
+ </div>
269
+ <nc-accordion variant="bordered">
270
+ <nc-accordion-item header="Routing and auth" open>
271
+ Protected routes render after sign-in through the authenticated shell, while the API service carries the access token across subsequent requests.
272
+ </nc-accordion-item>
273
+ <nc-accordion-item header="Signals and computed state">
274
+ Local dashboard interactions use `useState()` and `computed()` directly in the controller to prove reactive updates without a virtual DOM.
275
+ </nc-accordion-item>
276
+ <nc-accordion-item header="Component coverage">
277
+ This page intentionally combines alerts, cards, chips, badges, progress bars, tabs, timelines, tables, tooltips, and popovers to act as a real framework demo.
278
+ </nc-accordion-item>
279
+ </nc-accordion>
280
+ </nc-card>
281
+
282
+ <nc-empty-state title="Realtime feed pending" description="This panel is reserved for WebSocket or SSE integration once the dashboard moves beyond seeded mock data." icon="data" variant="bordered">
283
+ <div slot="actions">
284
+ <nc-a href="/docs" variant="ghost">Read architecture</nc-a>
285
+ </div>
286
+ </nc-empty-state>
287
+ </div>
288
+ </div>
289
+ </nc-tab-item>
290
+ </nc-tabs>
291
+ </nc-card>
292
+ </nc-animation>
293
+ </div>
@@ -0,0 +1,150 @@
1
+ <section class="hero">
2
+ <div class="hero-inner">
3
+ <div class="hero-badge">TypeScript-first. Web Components. Zero runtime production dependencies.</div>
4
+
5
+ <h1>Build serious web apps on web standards</h1>
6
+
7
+ <p class="hero-tagline">
8
+ NativeCore combines Web Components, Shadow DOM, reactive signals, lazy route controllers,
9
+ and auth-ready protected route patterns into one framework for teams that want platform-native architecture
10
+ without a virtual DOM runtime.
11
+ </p>
12
+
13
+ <div class="hero-actions">
14
+ <nc-a variant="hero-primary" href="/docs" id="get-started-btn">Read the Docs</nc-a>
15
+ <nc-a variant="hero-ghost" href="/components">Explore Components</nc-a>
16
+ <nc-a variant="hero-ghost" href="/login">Open Demo App</nc-a>
17
+ </div>
18
+
19
+ <div class="hero-stats">
20
+ <div class="stat-item">
21
+ <span class="stat-number">60+</span>
22
+ <span class="stat-label">Core Components</span>
23
+ </div>
24
+ <div class="stat-item">
25
+ <span class="stat-number">0</span>
26
+ <span class="stat-label">Runtime Dependencies</span>
27
+ </div>
28
+
29
+ <div class="stat-item">
30
+ <span class="stat-number">1</span>
31
+ <span class="stat-label">Framework Mental Model</span>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ </section>
36
+
37
+ <section class="why-section">
38
+ <div class="section-head">
39
+ <h2>Why teams choose NativeCore</h2>
40
+ <p class="section-subtitle">
41
+ NativeCore is strongest when you want framework-level structure while staying close to the platform.
42
+ </p>
43
+ </div>
44
+
45
+ <div class="why-cards">
46
+ <div class="comparison-card problem">
47
+ <div class="card-icon">Platform</div>
48
+ <h3>Built from browser primitives</h3>
49
+ <ul class="feature-list">
50
+ <li>Web Components and Shadow DOM for reusable UI</li>
51
+ <li>ES modules and native events instead of custom runtime rules</li>
52
+ <li>TypeScript as a compile-time tool, not an application runtime dependency</li>
53
+ <li>HTML views and controllers that stay readable to any strong web developer</li>
54
+ </ul>
55
+ </div>
56
+
57
+ <div class="comparison-card solution">
58
+ <div class="card-icon">Product</div>
59
+ <h3>Designed for production SPAs</h3>
60
+ <ul class="feature-list">
61
+ <li>Reactive signals, stores, and computed values</li>
62
+ <li>Lazy controllers, route caching, and auth-ready protected route patterns</li>
63
+ <li>Built-in component library for forms, navigation, overlays, and tables</li>
64
+ <li>Bot build tooling for SEO-sensitive static deployments</li>
65
+ </ul>
66
+ </div>
67
+ </div>
68
+ </section>
69
+
70
+ <section class="features-section">
71
+ <div class="section-head">
72
+ <h2>What ships with the framework</h2>
73
+ <p class="subtitle">
74
+ NativeCore already includes the core pieces teams usually assemble from several libraries.
75
+ </p>
76
+ </div>
77
+
78
+ <div class="features-grid">
79
+ <div class="feature-card">
80
+ <h3>Router and route protection</h3>
81
+ <p>Single-shell SPA routing with lazy-loaded route controllers, protected route gating, and explicit route registration.</p>
82
+ </div>
83
+
84
+ <div class="feature-card">
85
+ <h3>Reactive state</h3>
86
+ <p>Signals, computed values, and shared stores for fine-grained updates without a virtual DOM.</p>
87
+ </div>
88
+
89
+ <div class="feature-card">
90
+ <h3>Component system</h3>
91
+ <p>Shadow DOM-based components with lifecycle hooks, lazy registration, and standards-based interoperability.</p>
92
+ </div>
93
+
94
+ <div class="feature-card">
95
+ <h3>Auth foundation</h3>
96
+ <p>JWT-ready auth service, protected-route patterns, and a single-shell SPA architecture for real application flows.</p>
97
+ </div>
98
+
99
+ <div class="feature-card">
100
+ <h3>UI library</h3>
101
+ <p>Buttons, inputs, forms, menus, overlays, feedback components, tables, and navigation primitives.</p>
102
+ </div>
103
+
104
+ <div class="feature-card">
105
+ <h3>SEO-oriented builds</h3>
106
+ <p>Bot-targeted static output so teams can improve indexing without taking on full SSR infrastructure.</p>
107
+ </div>
108
+
109
+ <div class="feature-card">
110
+ <h3>Generator workflow</h3>
111
+ <p>Scaffold views, controllers, and components with the built-in scripts to preserve project conventions.</p>
112
+ </div>
113
+
114
+ <div class="feature-card">
115
+ <h3>Adoption path</h3>
116
+ <p>Docs, components demos, and an evolving `create:app` flow aimed at faster team onboarding.</p>
117
+ </div>
118
+ </div>
119
+ </section>
120
+
121
+ <section class="comparison-section">
122
+ <div class="section-head">
123
+ <h2>What NativeCore is building next</h2>
124
+ <p class="subtitle">
125
+ The next chapter is about proof, adoption, and consistency across the product.
126
+ </p>
127
+ </div>
128
+
129
+ <div class="features-grid">
130
+ <div class="feature-card">
131
+ <h3>Flagship app</h3>
132
+ <p>A real-world example application that proves NativeCore can support production workflows end to end.</p>
133
+ </div>
134
+
135
+ <div class="feature-card">
136
+ <h3>Official starters</h3>
137
+ <p>Stronger `create:app` templates for docs, dashboards, auth-first apps, and marketing-plus-app experiences.</p>
138
+ </div>
139
+
140
+ <div class="feature-card">
141
+ <h3>Adoption-first docs</h3>
142
+ <p>A clearer learning path from install, to first route, to forms, server-state, deployment, and extension patterns.</p>
143
+ </div>
144
+
145
+ <div class="feature-card">
146
+ <h3>Reproducible benchmarks</h3>
147
+ <p>Performance and bundle-size comparisons that can be rerun and verified by the community.</p>
148
+ </div>
149
+ </div>
150
+ </section>
@@ -0,0 +1,102 @@
1
+ <div class="login-experience">
2
+ <div class="login-shell">
3
+ <section class="login-showcase" aria-label="Demo access overview">
4
+ <div class="login-showcase__eyebrow">Enterprise Demo Access</div>
5
+ <h1 class="login-showcase__title">Demo sign in.</h1>
6
+ <p class="login-showcase__copy">
7
+ Simple access to the NativeCore dashboard demo.
8
+ </p>
9
+
10
+ <div class="login-showcase__grid">
11
+ <article class="login-showcase__card">
12
+ <h2>What this demo proves</h2>
13
+ <ul class="login-showcase__list">
14
+ <li>Protected route gating with dashboard handoff</li>
15
+ <li>API-backed authentication flow using seeded demo users</li>
16
+ <li>Component-driven UI built from NativeCore primitives</li>
17
+ </ul>
18
+ </article>
19
+
20
+ <article class="login-showcase__card login-showcase__card--accent">
21
+ <h2>Included in the walkthrough</h2>
22
+ <div class="login-showcase__metrics">
23
+ <div>
24
+ <strong>Public routes</strong>
25
+ <span>Marketing site and docs entry</span>
26
+ </div>
27
+ <div>
28
+ <strong>Protected routes</strong>
29
+ <span>Dashboard access, auth state, and API data</span>
30
+ </div>
31
+ <div>
32
+ <strong>Demo account</strong>
33
+ <span>Pre-seeded credentials for fast validation</span>
34
+ </div>
35
+ </div>
36
+ </article>
37
+ </div>
38
+ </section>
39
+
40
+ <section class="login-panel" aria-label="Sign in form">
41
+ <div class="login-panel__header">
42
+ <p class="login-panel__eyebrow">Secure Workspace Sign In</p>
43
+ <h2>Access the NativeCore demo dashboard</h2>
44
+ <p>Use the demo credentials below.</p>
45
+ </div>
46
+
47
+ <div class="login-demo-credentials" aria-label="Demo credentials">
48
+ <div class="login-demo-credentials__item">
49
+ <span>Demo email</span>
50
+ <strong>demo@example.com</strong>
51
+ </div>
52
+ <div class="login-demo-credentials__item">
53
+ <span>Demo password</span>
54
+ <strong>pa$$w0rd</strong>
55
+ </div>
56
+ </div>
57
+
58
+ <div id="login-error" class="login-alert alert alert-error" hidden aria-live="polite"></div>
59
+
60
+ <nc-form id="loginForm" class="login-form">
61
+ <nc-field class="login-field" label="Work Email" for="email" required>
62
+ <nc-input
63
+ id="email"
64
+ name="email"
65
+ type="email"
66
+ autocomplete="username email"
67
+ placeholder="demo@example.com"
68
+ value="demo@example.com"
69
+ required
70
+ ></nc-input>
71
+ </nc-field>
72
+
73
+ <nc-field class="login-field" label="Password" for="password" required>
74
+ <nc-input
75
+ id="password"
76
+ name="password"
77
+ type="password"
78
+ autocomplete="current-password"
79
+ placeholder="Enter your password"
80
+ value="pa$$w0rd"
81
+ required
82
+ minlength="8"
83
+ show-password-toggle
84
+ ></nc-input>
85
+ </nc-field>
86
+
87
+ <div class="login-form__utility">
88
+ <nc-checkbox id="rememberMe" name="rememberMe" label="Remember demo email" checked></nc-checkbox>
89
+ <a href="/docs" data-link class="login-form__utility-link">Review the docs</a>
90
+ </div>
91
+
92
+ <nc-button id="loginBtn" type="submit" variant="primary" size="lg" full-width>
93
+ Access Dashboard
94
+ </nc-button>
95
+ </nc-form>
96
+
97
+ <p class="login-panel__footer">
98
+ Demo account only. The credentials above are intentionally exposed for evaluation purposes.
99
+ </p>
100
+ </section>
101
+ </div>
102
+ </div>
@@ -0,0 +1,87 @@
1
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
+ import { Component, defineComponent } from '../../src/core/component.js';
3
+
4
+ class TestComponentElement extends Component {
5
+ static useShadowDOM = true;
6
+ static observedAttributes = ['label'];
7
+
8
+ template(): string {
9
+ return `<div class="label">${this.getAttribute('label') ?? 'Default'}</div>`;
10
+ }
11
+ }
12
+
13
+ class FocusPreservingComponent extends Component {
14
+ static useShadowDOM = true;
15
+
16
+ constructor() {
17
+ super();
18
+ this.state = {
19
+ label: 'Initial label'
20
+ };
21
+ }
22
+
23
+ template(): string {
24
+ return `
25
+ <div class="wrapper">
26
+ <label for="name">${this.state.label}</label>
27
+ <input id="name" value="keep-me" />
28
+ </div>
29
+ `;
30
+ }
31
+ }
32
+
33
+ defineComponent('test-component-element', TestComponentElement);
34
+ defineComponent('focus-preserving-component', FocusPreservingComponent);
35
+
36
+ describe('core/component', () => {
37
+ let container: HTMLDivElement;
38
+
39
+ beforeEach(() => {
40
+ container = document.createElement('div');
41
+ document.body.appendChild(container);
42
+ });
43
+
44
+ afterEach(() => {
45
+ container.remove();
46
+ document.body.innerHTML = '';
47
+ });
48
+
49
+ it('renders into shadow DOM when enabled', () => {
50
+ const element = document.createElement('test-component-element') as TestComponentElement;
51
+ container.appendChild(element);
52
+
53
+ expect(element.shadowRoot).not.toBeNull();
54
+ expect(element.shadowRoot?.querySelector('.label')?.textContent).toBe('Default');
55
+ });
56
+
57
+ it('rerenders when observed attributes change', () => {
58
+ const element = document.createElement('test-component-element') as TestComponentElement;
59
+ container.appendChild(element);
60
+
61
+ element.setAttribute('label', 'Updated');
62
+
63
+ expect(element.shadowRoot?.querySelector('.label')?.textContent).toBe('Updated');
64
+ });
65
+
66
+ it('patches the existing DOM instead of replacing focused elements', () => {
67
+ const element = document.createElement('focus-preserving-component') as FocusPreservingComponent;
68
+ container.appendChild(element);
69
+
70
+ const shadowRoot = element.shadowRoot as ShadowRoot;
71
+ const inputBefore = shadowRoot.querySelector<HTMLInputElement>('#name');
72
+ const labelBefore = shadowRoot.querySelector('label');
73
+
74
+ expect(inputBefore).toBeTruthy();
75
+ expect(labelBefore?.textContent).toBe('Initial label');
76
+
77
+ inputBefore?.focus();
78
+ element.setState({ label: 'Updated label' });
79
+
80
+ const inputAfter = shadowRoot.querySelector<HTMLInputElement>('#name');
81
+ const labelAfter = shadowRoot.querySelector('label');
82
+
83
+ expect(inputAfter).toBe(inputBefore);
84
+ expect(labelAfter?.textContent).toBe('Updated label');
85
+ expect(shadowRoot.activeElement).toBe(inputAfter);
86
+ });
87
+ });