nextblogkit 0.6.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 (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +951 -0
  3. package/dist/admin/index.cjs +2465 -0
  4. package/dist/admin/index.cjs.map +1 -0
  5. package/dist/admin/index.d.cts +44 -0
  6. package/dist/admin/index.d.ts +44 -0
  7. package/dist/admin/index.js +2438 -0
  8. package/dist/admin/index.js.map +1 -0
  9. package/dist/api/categories.cjs +82 -0
  10. package/dist/api/categories.cjs.map +1 -0
  11. package/dist/api/categories.d.cts +27 -0
  12. package/dist/api/categories.d.ts +27 -0
  13. package/dist/api/categories.js +77 -0
  14. package/dist/api/categories.js.map +1 -0
  15. package/dist/api/media.cjs +113 -0
  16. package/dist/api/media.cjs.map +1 -0
  17. package/dist/api/media.d.cts +22 -0
  18. package/dist/api/media.d.ts +22 -0
  19. package/dist/api/media.js +109 -0
  20. package/dist/api/media.js.map +1 -0
  21. package/dist/api/posts.cjs +103 -0
  22. package/dist/api/posts.cjs.map +1 -0
  23. package/dist/api/posts.d.cts +27 -0
  24. package/dist/api/posts.d.ts +27 -0
  25. package/dist/api/posts.js +98 -0
  26. package/dist/api/posts.js.map +1 -0
  27. package/dist/api/rss.cjs +25 -0
  28. package/dist/api/rss.cjs.map +1 -0
  29. package/dist/api/rss.d.cts +5 -0
  30. package/dist/api/rss.d.ts +5 -0
  31. package/dist/api/rss.js +23 -0
  32. package/dist/api/rss.js.map +1 -0
  33. package/dist/api/settings.cjs +40 -0
  34. package/dist/api/settings.cjs.map +1 -0
  35. package/dist/api/settings.d.cts +17 -0
  36. package/dist/api/settings.d.ts +17 -0
  37. package/dist/api/settings.js +37 -0
  38. package/dist/api/settings.js.map +1 -0
  39. package/dist/api/sitemap.cjs +25 -0
  40. package/dist/api/sitemap.cjs.map +1 -0
  41. package/dist/api/sitemap.d.cts +5 -0
  42. package/dist/api/sitemap.d.ts +5 -0
  43. package/dist/api/sitemap.js +23 -0
  44. package/dist/api/sitemap.js.map +1 -0
  45. package/dist/chunk-4NKOJYWJ.js +68 -0
  46. package/dist/chunk-4NKOJYWJ.js.map +1 -0
  47. package/dist/chunk-4PY224XM.js +103 -0
  48. package/dist/chunk-4PY224XM.js.map +1 -0
  49. package/dist/chunk-64HUVJOZ.js +446 -0
  50. package/dist/chunk-64HUVJOZ.js.map +1 -0
  51. package/dist/chunk-6HKMZOI4.cjs +48 -0
  52. package/dist/chunk-6HKMZOI4.cjs.map +1 -0
  53. package/dist/chunk-A2S32RZN.js +138 -0
  54. package/dist/chunk-A2S32RZN.js.map +1 -0
  55. package/dist/chunk-E2QLTHKN.cjs +70 -0
  56. package/dist/chunk-E2QLTHKN.cjs.map +1 -0
  57. package/dist/chunk-JLPJKNRZ.js +37 -0
  58. package/dist/chunk-JLPJKNRZ.js.map +1 -0
  59. package/dist/chunk-JM7QRXXK.js +330 -0
  60. package/dist/chunk-JM7QRXXK.js.map +1 -0
  61. package/dist/chunk-KDZER3PU.cjs +43 -0
  62. package/dist/chunk-KDZER3PU.cjs.map +1 -0
  63. package/dist/chunk-N5MKAD7J.cjs +109 -0
  64. package/dist/chunk-N5MKAD7J.cjs.map +1 -0
  65. package/dist/chunk-QE4VLQYN.cjs +337 -0
  66. package/dist/chunk-QE4VLQYN.cjs.map +1 -0
  67. package/dist/chunk-R6MO3QIP.js +46 -0
  68. package/dist/chunk-R6MO3QIP.js.map +1 -0
  69. package/dist/chunk-U2ROR6AY.cjs +476 -0
  70. package/dist/chunk-U2ROR6AY.cjs.map +1 -0
  71. package/dist/chunk-ZP5XRVVH.cjs +141 -0
  72. package/dist/chunk-ZP5XRVVH.cjs.map +1 -0
  73. package/dist/cli/index.cjs +1308 -0
  74. package/dist/components/index.cjs +541 -0
  75. package/dist/components/index.cjs.map +1 -0
  76. package/dist/components/index.d.cts +165 -0
  77. package/dist/components/index.d.ts +165 -0
  78. package/dist/components/index.js +527 -0
  79. package/dist/components/index.js.map +1 -0
  80. package/dist/editor/index.cjs +1083 -0
  81. package/dist/editor/index.cjs.map +1 -0
  82. package/dist/editor/index.d.cts +133 -0
  83. package/dist/editor/index.d.ts +133 -0
  84. package/dist/editor/index.js +1051 -0
  85. package/dist/editor/index.js.map +1 -0
  86. package/dist/index-Cgzphklp.d.ts +266 -0
  87. package/dist/index-vjlZDWNr.d.cts +266 -0
  88. package/dist/index.cjs +368 -0
  89. package/dist/index.cjs.map +1 -0
  90. package/dist/index.d.cts +27 -0
  91. package/dist/index.d.ts +27 -0
  92. package/dist/index.js +208 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/lib/index.cjs +120 -0
  95. package/dist/lib/index.cjs.map +1 -0
  96. package/dist/lib/index.d.cts +4 -0
  97. package/dist/lib/index.d.ts +4 -0
  98. package/dist/lib/index.js +7 -0
  99. package/dist/lib/index.js.map +1 -0
  100. package/dist/styles/admin.css +657 -0
  101. package/dist/styles/blog.css +851 -0
  102. package/dist/styles/editor.css +452 -0
  103. package/dist/styles/globals.css +270 -0
  104. package/dist/styles/prose.css +299 -0
  105. package/dist/types-CBEEBR4A.d.cts +732 -0
  106. package/dist/types-CBEEBR4A.d.ts +732 -0
  107. package/package.json +134 -0
@@ -0,0 +1,452 @@
1
+ /* NextBlogKit — Editor Styles */
2
+
3
+ .nbk-editor {
4
+ border: 1px solid var(--nbk-border);
5
+ border-radius: 0.75rem;
6
+ background: var(--nbk-card-bg);
7
+ overflow: hidden;
8
+ }
9
+
10
+ /* Toolbar */
11
+ .nbk-editor-toolbar {
12
+ display: flex;
13
+ align-items: center;
14
+ gap: 0.25rem;
15
+ padding: 0.5rem;
16
+ border-bottom: 1px solid var(--nbk-border);
17
+ background: var(--nbk-bg-secondary);
18
+ flex-wrap: wrap;
19
+ position: sticky;
20
+ top: 0;
21
+ z-index: 10;
22
+ }
23
+
24
+ .nbk-toolbar-group {
25
+ display: flex;
26
+ gap: 0.125rem;
27
+ }
28
+
29
+ .nbk-toolbar-divider {
30
+ width: 1px;
31
+ height: 24px;
32
+ background: var(--nbk-border);
33
+ margin: 0 0.25rem;
34
+ }
35
+
36
+ .nbk-toolbar-btn {
37
+ display: flex;
38
+ align-items: center;
39
+ justify-content: center;
40
+ width: 32px;
41
+ height: 32px;
42
+ border: none;
43
+ background: transparent;
44
+ border-radius: 6px;
45
+ cursor: pointer;
46
+ font-size: 0.875rem;
47
+ color: var(--nbk-text);
48
+ transition: all 0.15s var(--nbk-transition);
49
+ }
50
+
51
+ .nbk-toolbar-btn:hover {
52
+ background: #f3f4f6;
53
+ transform: scale(1.05);
54
+ }
55
+
56
+ .nbk-toolbar-btn.active {
57
+ background: var(--nbk-primary-light);
58
+ color: #2563eb;
59
+ }
60
+
61
+ /* ================================================================
62
+ WYSIWYG Typography — Editor content should match the blog view
63
+ ================================================================ */
64
+
65
+ .nbk-editor-content {
66
+ min-height: 400px;
67
+ padding: 2rem 2.5rem;
68
+ outline: none;
69
+ font-family: var(--nbk-font-body);
70
+ color: #374151;
71
+ line-height: 1.8;
72
+ font-size: 1.125rem;
73
+ }
74
+
75
+ .nbk-editor-content {
76
+ min-height: 400px;
77
+ outline: none;
78
+ }
79
+
80
+ .nbk-editor-content > * + * {
81
+ margin-top: 0.75rem;
82
+ }
83
+
84
+ /* Headings */
85
+ .nbk-editor-content h1 {
86
+ font-family: var(--nbk-font-heading);
87
+ font-size: 2.25rem;
88
+ font-weight: 700;
89
+ line-height: 1.2;
90
+ margin-top: 2.5rem;
91
+ margin-bottom: 1rem;
92
+ letter-spacing: -0.025em;
93
+ color: var(--nbk-text);
94
+ }
95
+
96
+ .nbk-editor-content h2 {
97
+ font-family: var(--nbk-font-heading);
98
+ font-size: 1.875rem;
99
+ font-weight: 700;
100
+ line-height: 1.3;
101
+ margin-top: 2.5rem;
102
+ margin-bottom: 1rem;
103
+ letter-spacing: -0.025em;
104
+ color: var(--nbk-primary);
105
+ padding-bottom: 0.5rem;
106
+ border-bottom: 2px solid var(--nbk-primary-light);
107
+ }
108
+
109
+ .nbk-editor-content h3 {
110
+ font-family: var(--nbk-font-heading);
111
+ font-size: 1.5rem;
112
+ font-weight: 700;
113
+ line-height: 1.4;
114
+ margin-top: 2rem;
115
+ margin-bottom: 0.75rem;
116
+ color: var(--nbk-text);
117
+ }
118
+
119
+ .nbk-editor-content h4 {
120
+ font-family: var(--nbk-font-heading);
121
+ font-size: 1.25rem;
122
+ font-weight: 600;
123
+ line-height: 1.4;
124
+ margin-top: 1.5rem;
125
+ margin-bottom: 0.5rem;
126
+ color: var(--nbk-text);
127
+ }
128
+
129
+ /* Paragraphs */
130
+ .nbk-editor-content p {
131
+ margin: 0 0 1rem;
132
+ line-height: 1.8;
133
+ }
134
+
135
+ /* Links */
136
+ .nbk-editor-content a {
137
+ color: var(--nbk-primary);
138
+ text-decoration: none;
139
+ border-bottom: 1px solid var(--nbk-primary);
140
+ cursor: pointer;
141
+ }
142
+
143
+ /* Inline code */
144
+ .nbk-editor-content code {
145
+ font-family: var(--nbk-font-code);
146
+ font-size: 0.875em;
147
+ background: #f3f4f6;
148
+ color: #e11d48;
149
+ padding: 0.125em 0.375em;
150
+ border-radius: 0.25rem;
151
+ }
152
+
153
+ /* Code blocks */
154
+ .nbk-editor-content pre {
155
+ background: #0f172a;
156
+ color: #86efac;
157
+ padding: 1.25rem;
158
+ border-radius: 0.75rem;
159
+ overflow-x: auto;
160
+ font-family: var(--nbk-font-code);
161
+ font-size: 0.875rem;
162
+ line-height: 1.6;
163
+ margin: 1rem 0;
164
+ }
165
+
166
+ .nbk-editor-content pre code {
167
+ background: transparent;
168
+ color: inherit;
169
+ padding: 0;
170
+ font-size: inherit;
171
+ }
172
+
173
+ /* Blockquotes */
174
+ .nbk-editor-content blockquote {
175
+ border-left: 4px solid var(--nbk-primary);
176
+ padding: 0.75rem 1.5rem;
177
+ margin: 1rem 0;
178
+ color: var(--nbk-text-muted);
179
+ background: rgba(37, 99, 235, 0.03);
180
+ border-radius: 0 0.75rem 0.75rem 0;
181
+ font-style: italic;
182
+ font-size: 1.25rem;
183
+ }
184
+
185
+ .nbk-editor-content blockquote p {
186
+ margin-bottom: 0;
187
+ }
188
+
189
+ /* Lists */
190
+ .nbk-editor-content ul,
191
+ .nbk-editor-content ol {
192
+ padding-left: 1.75rem;
193
+ margin: 0.75rem 0;
194
+ }
195
+
196
+ .nbk-editor-content li {
197
+ margin-top: 0.375rem;
198
+ line-height: 1.7;
199
+ }
200
+
201
+ .nbk-editor-content li p {
202
+ margin-bottom: 0.25rem;
203
+ }
204
+
205
+ .nbk-editor-content li::marker {
206
+ color: var(--nbk-text-muted);
207
+ }
208
+
209
+ /* Images */
210
+ .nbk-editor-content img {
211
+ max-width: 100%;
212
+ height: auto;
213
+ border-radius: 0.75rem;
214
+ margin: 0.5rem 0;
215
+ }
216
+
217
+ /* Tables */
218
+ .nbk-editor-content table {
219
+ width: 100%;
220
+ border-collapse: collapse;
221
+ margin: 1rem 0;
222
+ font-size: 0.9375rem;
223
+ }
224
+
225
+ .nbk-editor-content th,
226
+ .nbk-editor-content td {
227
+ border: 1px solid var(--nbk-border);
228
+ padding: 0.5rem 0.75rem;
229
+ text-align: left;
230
+ }
231
+
232
+ .nbk-editor-content th {
233
+ background: #f9fafb;
234
+ font-weight: 600;
235
+ }
236
+
237
+ /* Horizontal rule */
238
+ .nbk-editor-content hr {
239
+ border: none;
240
+ border-top: 2px solid var(--nbk-border);
241
+ margin: 2rem 0;
242
+ }
243
+
244
+ /* Highlight */
245
+ .nbk-editor-content mark {
246
+ background: #fef08a;
247
+ padding: 0 0.125rem;
248
+ border-radius: 2px;
249
+ }
250
+
251
+ /* Task lists */
252
+ .nbk-editor-content ul[data-type="taskList"] {
253
+ list-style: none;
254
+ padding-left: 0;
255
+ }
256
+
257
+ .nbk-editor-content ul[data-type="taskList"] li {
258
+ display: flex;
259
+ align-items: flex-start;
260
+ gap: 0.5rem;
261
+ }
262
+
263
+ .nbk-editor-content ul[data-type="taskList"] li input[type="checkbox"] {
264
+ margin-top: 0.375rem;
265
+ }
266
+
267
+ /* Placeholder */
268
+ .nbk-editor-content p.is-editor-empty:first-child::before {
269
+ color: var(--nbk-text-muted);
270
+ content: attr(data-placeholder);
271
+ float: left;
272
+ height: 0;
273
+ pointer-events: none;
274
+ }
275
+
276
+ /* Block hover effect */
277
+ .nbk-editor-content > *:hover {
278
+ background: rgba(0, 0, 0, 0.01);
279
+ border-radius: 4px;
280
+ }
281
+
282
+ /* Selected blocks */
283
+ .nbk-editor-content .has-focus,
284
+ .nbk-editor-content ::selection {
285
+ background: rgba(35, 131, 226, 0.08);
286
+ }
287
+
288
+ .nbk-editor-content .is-empty::before {
289
+ color: var(--nbk-text-muted);
290
+ opacity: 0.5;
291
+ }
292
+
293
+ /* Bubble Menu */
294
+ .nbk-bubble-menu {
295
+ display: flex;
296
+ gap: 0.125rem;
297
+ background: var(--nbk-text);
298
+ border-radius: 8px;
299
+ padding: 0.25rem;
300
+ box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
301
+ animation: nbk-slide-in 0.15s var(--nbk-transition);
302
+ }
303
+
304
+ .nbk-bubble-menu button {
305
+ padding: 0.25rem 0.5rem;
306
+ border: none;
307
+ background: transparent;
308
+ color: #fff;
309
+ font-size: 0.8125rem;
310
+ border-radius: 4px;
311
+ cursor: pointer;
312
+ transition: background 0.1s var(--nbk-transition);
313
+ }
314
+
315
+ .nbk-bubble-menu button:hover {
316
+ background: rgba(255, 255, 255, 0.1);
317
+ }
318
+
319
+ .nbk-bubble-menu button.active {
320
+ background: rgba(255, 255, 255, 0.2);
321
+ }
322
+
323
+ /* Slash Command Menu */
324
+ .nbk-slash-menu {
325
+ background: var(--nbk-card-bg);
326
+ border: 1px solid var(--nbk-border);
327
+ border-radius: 8px;
328
+ box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
329
+ max-height: 320px;
330
+ overflow-y: auto;
331
+ width: 280px;
332
+ z-index: 100;
333
+ animation: nbk-slide-in 0.15s var(--nbk-transition);
334
+ }
335
+
336
+ .nbk-slash-item {
337
+ display: flex;
338
+ align-items: center;
339
+ gap: 0.75rem;
340
+ padding: 0.625rem 0.75rem;
341
+ width: 100%;
342
+ border: none;
343
+ background: transparent;
344
+ cursor: pointer;
345
+ text-align: left;
346
+ color: var(--nbk-text);
347
+ transition: all 0.15s var(--nbk-transition);
348
+ }
349
+
350
+ .nbk-slash-item:hover,
351
+ .nbk-slash-item.selected {
352
+ background: var(--nbk-bg-secondary);
353
+ transform: translateX(2px);
354
+ }
355
+
356
+ .nbk-slash-icon {
357
+ width: 32px;
358
+ height: 32px;
359
+ display: flex;
360
+ align-items: center;
361
+ justify-content: center;
362
+ background: var(--nbk-bg-secondary);
363
+ border-radius: 6px;
364
+ font-size: 1rem;
365
+ flex-shrink: 0;
366
+ }
367
+
368
+ .nbk-slash-title {
369
+ font-size: 0.875rem;
370
+ font-weight: 500;
371
+ }
372
+
373
+ .nbk-slash-desc {
374
+ font-size: 0.75rem;
375
+ color: var(--nbk-text-muted);
376
+ }
377
+
378
+ /* Status Bar */
379
+ .nbk-editor-status {
380
+ display: flex;
381
+ gap: 1rem;
382
+ padding: 0.5rem 1rem;
383
+ border-top: 1px solid var(--nbk-border);
384
+ font-size: 0.75rem;
385
+ color: var(--nbk-text-muted);
386
+ }
387
+
388
+ .nbk-saving {
389
+ color: var(--nbk-primary);
390
+ }
391
+
392
+ /* Block Styles — Callouts */
393
+ .nbk-editor-content .nbk-callout {
394
+ display: flex;
395
+ gap: 0.75rem;
396
+ padding: 1rem;
397
+ border-radius: 0.75rem;
398
+ margin: 1rem 0;
399
+ }
400
+
401
+ .nbk-callout-info { background: #eff6ff; border-left: 4px solid #3b82f6; }
402
+ .nbk-callout-warning { background: #fffbeb; border-left: 4px solid #f59e0b; }
403
+ .nbk-callout-tip { background: #f0fdf4; border-left: 4px solid #22c55e; }
404
+ .nbk-callout-danger { background: #fef2f2; border-left: 4px solid #ef4444; }
405
+
406
+ .nbk-callout-icon {
407
+ font-size: 1.25rem;
408
+ flex-shrink: 0;
409
+ }
410
+
411
+ .nbk-callout-content {
412
+ flex: 1;
413
+ }
414
+
415
+ /* Block Styles — FAQ */
416
+ .nbk-editor-content .nbk-faq {
417
+ margin: 1rem 0;
418
+ }
419
+
420
+ .nbk-faq-item {
421
+ border: 1px solid var(--nbk-border);
422
+ border-radius: 0.75rem;
423
+ margin-bottom: 0.5rem;
424
+ overflow: hidden;
425
+ }
426
+
427
+ .nbk-faq-question {
428
+ padding: 0.75rem 1rem;
429
+ background: var(--nbk-bg-secondary);
430
+ font-weight: 600;
431
+ }
432
+
433
+ .nbk-faq-answer {
434
+ padding: 0.75rem 1rem;
435
+ }
436
+
437
+ .nbk-toc-placeholder {
438
+ padding: 1rem;
439
+ background: var(--nbk-bg-secondary);
440
+ border-radius: 0.75rem;
441
+ color: var(--nbk-text-muted);
442
+ font-style: italic;
443
+ text-align: center;
444
+ }
445
+
446
+ /* Image loading state — shimmer */
447
+ .nbk-editor-content img[data-loading="true"] {
448
+ opacity: 0.7;
449
+ background: linear-gradient(90deg, #f3f4f6 25%, #e5e7eb 50%, #f3f4f6 75%);
450
+ background-size: 200% 100%;
451
+ animation: nbk-shimmer 1.5s infinite;
452
+ }
@@ -0,0 +1,270 @@
1
+ /* NextBlogKit — Global CSS Variables & Base Styles */
2
+
3
+ :root {
4
+ --nbk-primary: #2563eb;
5
+ --nbk-primary-hover: #1d4ed8;
6
+ --nbk-primary-light: #dbeafe;
7
+ --nbk-text: #1f2937;
8
+ --nbk-text-muted: #6b7280;
9
+ --nbk-bg: #ffffff;
10
+ --nbk-bg-secondary: #f9fafb;
11
+ --nbk-card-bg: #ffffff;
12
+ --nbk-border: #e5e7eb;
13
+ --nbk-border-focus: #2563eb;
14
+ --nbk-radius: 0.5rem;
15
+ --nbk-shadow: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06);
16
+ --nbk-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
17
+ --nbk-shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1), 0 4px 6px rgba(0, 0, 0, 0.05);
18
+ --nbk-shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.1), 0 10px 10px rgba(0, 0, 0, 0.04);
19
+ --nbk-font-heading: "Inter", system-ui, -apple-system, sans-serif;
20
+ --nbk-font-body: "Inter", system-ui, -apple-system, sans-serif;
21
+ --nbk-font-code: "JetBrains Mono", "Fira Code", "Cascadia Code", monospace;
22
+ --nbk-success: #10b981;
23
+ --nbk-warning: #f59e0b;
24
+ --nbk-danger: #ef4444;
25
+ --nbk-info: #3b82f6;
26
+ --nbk-transition: cubic-bezier(0.4, 0, 0.2, 1);
27
+ --nbk-focus-ring: 0 0 0 3px rgba(37, 99, 235, 0.1);
28
+ }
29
+
30
+ @media (prefers-color-scheme: dark) {
31
+ :root {
32
+ --nbk-text: #f3f4f6;
33
+ --nbk-text-muted: #9ca3af;
34
+ --nbk-bg: #111827;
35
+ --nbk-bg-secondary: #1f2937;
36
+ --nbk-card-bg: #1f2937;
37
+ --nbk-border: #374151;
38
+ }
39
+ }
40
+
41
+ /* Keyframes */
42
+ @keyframes nbk-slide-in {
43
+ from {
44
+ opacity: 0;
45
+ transform: translateY(-8px) scale(0.96);
46
+ }
47
+ to {
48
+ opacity: 1;
49
+ transform: translateY(0) scale(1);
50
+ }
51
+ }
52
+
53
+ @keyframes nbk-fade-in {
54
+ from {
55
+ opacity: 0;
56
+ }
57
+ to {
58
+ opacity: 1;
59
+ }
60
+ }
61
+
62
+ @keyframes nbk-shimmer {
63
+ 0% {
64
+ background-position: -200% 0;
65
+ }
66
+ 100% {
67
+ background-position: 200% 0;
68
+ }
69
+ }
70
+
71
+ /* Utility classes */
72
+ .nbk-loading {
73
+ text-align: center;
74
+ padding: 2rem;
75
+ color: var(--nbk-text-muted);
76
+ font-family: var(--nbk-font-body);
77
+ }
78
+
79
+ .nbk-empty-state {
80
+ text-align: center;
81
+ padding: 3rem 1rem;
82
+ color: var(--nbk-text-muted);
83
+ font-family: var(--nbk-font-body);
84
+ }
85
+
86
+ .nbk-error {
87
+ background: #fef2f2;
88
+ border: 1px solid #fecaca;
89
+ color: #b91c1c;
90
+ padding: 0.75rem 1rem;
91
+ border-radius: var(--nbk-radius);
92
+ margin-bottom: 1rem;
93
+ font-family: var(--nbk-font-body);
94
+ }
95
+
96
+ .nbk-hidden {
97
+ display: none;
98
+ }
99
+
100
+ /* Buttons */
101
+ .nbk-btn {
102
+ display: inline-flex;
103
+ align-items: center;
104
+ gap: 0.5rem;
105
+ padding: 0.5rem 1rem;
106
+ border-radius: var(--nbk-radius);
107
+ font-family: var(--nbk-font-body);
108
+ font-size: 0.875rem;
109
+ font-weight: 500;
110
+ cursor: pointer;
111
+ border: 1px solid var(--nbk-border);
112
+ background: var(--nbk-bg);
113
+ color: var(--nbk-text);
114
+ text-decoration: none;
115
+ transition: all 0.2s var(--nbk-transition);
116
+ }
117
+
118
+ .nbk-btn:hover {
119
+ background: var(--nbk-bg-secondary);
120
+ }
121
+
122
+ .nbk-btn-primary {
123
+ background: var(--nbk-primary);
124
+ color: #ffffff;
125
+ border-color: var(--nbk-primary);
126
+ }
127
+
128
+ .nbk-btn-primary:hover {
129
+ background: var(--nbk-primary-hover);
130
+ }
131
+
132
+ .nbk-btn-secondary {
133
+ background: var(--nbk-bg-secondary);
134
+ }
135
+
136
+ .nbk-btn-danger {
137
+ color: var(--nbk-danger);
138
+ border-color: var(--nbk-danger);
139
+ }
140
+
141
+ .nbk-btn-danger:hover {
142
+ background: var(--nbk-danger);
143
+ color: #ffffff;
144
+ }
145
+
146
+ .nbk-btn-sm {
147
+ padding: 0.25rem 0.5rem;
148
+ font-size: 0.75rem;
149
+ }
150
+
151
+ .nbk-btn-icon {
152
+ background: none;
153
+ border: none;
154
+ cursor: pointer;
155
+ padding: 0.25rem;
156
+ color: var(--nbk-text-muted);
157
+ }
158
+
159
+ .nbk-btn-icon:disabled {
160
+ opacity: 0.3;
161
+ cursor: not-allowed;
162
+ }
163
+
164
+ /* Form elements */
165
+ .nbk-input,
166
+ .nbk-select,
167
+ .nbk-textarea {
168
+ width: 100%;
169
+ padding: 0.5rem 0.75rem;
170
+ border: 1px solid var(--nbk-border);
171
+ border-radius: var(--nbk-radius);
172
+ font-family: var(--nbk-font-body);
173
+ font-size: 0.875rem;
174
+ background: var(--nbk-bg);
175
+ color: var(--nbk-text);
176
+ transition: border-color 0.2s var(--nbk-transition), box-shadow 0.2s var(--nbk-transition);
177
+ }
178
+
179
+ .nbk-input:focus,
180
+ .nbk-select:focus,
181
+ .nbk-textarea:focus {
182
+ outline: none;
183
+ border-color: var(--nbk-border-focus);
184
+ box-shadow: var(--nbk-focus-ring);
185
+ }
186
+
187
+ .nbk-label {
188
+ display: block;
189
+ font-size: 0.8125rem;
190
+ font-weight: 500;
191
+ margin-bottom: 0.25rem;
192
+ color: var(--nbk-text);
193
+ font-family: var(--nbk-font-body);
194
+ }
195
+
196
+ .nbk-field {
197
+ margin-bottom: 1rem;
198
+ }
199
+
200
+ .nbk-checkbox-label {
201
+ display: flex;
202
+ align-items: center;
203
+ gap: 0.5rem;
204
+ font-size: 0.875rem;
205
+ color: var(--nbk-text);
206
+ cursor: pointer;
207
+ }
208
+
209
+ .nbk-form-row {
210
+ display: flex;
211
+ gap: 0.75rem;
212
+ }
213
+
214
+ .nbk-form-actions {
215
+ display: flex;
216
+ gap: 0.5rem;
217
+ margin-top: 0.75rem;
218
+ }
219
+
220
+ /* Badges */
221
+ .nbk-badge {
222
+ display: inline-block;
223
+ padding: 0.125rem 0.5rem;
224
+ border-radius: 9999px;
225
+ font-size: 0.75rem;
226
+ font-weight: 500;
227
+ }
228
+
229
+ .nbk-badge-green { background: #d1fae5; color: #065f46; }
230
+ .nbk-badge-yellow { background: #fef3c7; color: #92400e; }
231
+ .nbk-badge-blue { background: #dbeafe; color: #1e40af; }
232
+ .nbk-badge-gray { background: #f3f4f6; color: #4b5563; }
233
+
234
+ /* Table */
235
+ .nbk-table {
236
+ width: 100%;
237
+ border-collapse: collapse;
238
+ font-family: var(--nbk-font-body);
239
+ font-size: 0.875rem;
240
+ }
241
+
242
+ .nbk-table th {
243
+ text-align: left;
244
+ padding: 0.75rem;
245
+ font-weight: 600;
246
+ border-bottom: 2px solid var(--nbk-border);
247
+ color: var(--nbk-text-muted);
248
+ font-size: 0.75rem;
249
+ text-transform: uppercase;
250
+ letter-spacing: 0.05em;
251
+ }
252
+
253
+ .nbk-table td {
254
+ padding: 0.75rem;
255
+ border-bottom: 1px solid var(--nbk-border);
256
+ color: var(--nbk-text);
257
+ }
258
+
259
+ .nbk-table tr:hover td {
260
+ background: var(--nbk-bg-secondary);
261
+ }
262
+
263
+ .nbk-th-checkbox { width: 2rem; }
264
+
265
+ .nbk-actions {
266
+ display: flex;
267
+ gap: 0.375rem;
268
+ }
269
+
270
+ .nbk-text-muted { color: var(--nbk-text-muted); }