@fgv/ts-app-shell 5.1.0-3 → 5.1.0-31

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 (208) hide show
  1. package/README.md +159 -0
  2. package/dist/index.browser.js.map +1 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/packlets/ai-assist/index.js.map +1 -0
  5. package/dist/packlets/ai-assist/useAiAssist.js +216 -15
  6. package/dist/packlets/ai-assist/useAiAssist.js.map +1 -0
  7. package/dist/packlets/badge/index.js +23 -0
  8. package/dist/packlets/badge/index.js.map +1 -0
  9. package/dist/packlets/badge/renderStatusBadge.js +44 -0
  10. package/dist/packlets/badge/renderStatusBadge.js.map +1 -0
  11. package/dist/packlets/cascade/CascadeContainer.js.map +1 -0
  12. package/dist/packlets/cascade/ComparisonView.js.map +1 -0
  13. package/dist/packlets/cascade/EntityTabLayout.js.map +1 -0
  14. package/dist/packlets/cascade/MobileCascadeStack.js.map +1 -0
  15. package/dist/packlets/cascade/index.js.map +1 -0
  16. package/dist/packlets/cascade/model.js.map +1 -0
  17. package/dist/packlets/cascade/useCascadeOps.js.map +1 -0
  18. package/dist/packlets/cascade/useCascadeTransitions.js.map +1 -0
  19. package/dist/packlets/detail/DetailHelpers.js.map +1 -0
  20. package/dist/packlets/detail/index.js.map +1 -0
  21. package/dist/packlets/drop-zone/JsonDropZone.js.map +1 -0
  22. package/dist/packlets/drop-zone/index.js.map +1 -0
  23. package/dist/packlets/editing/EditFieldHelpers.js +4 -4
  24. package/dist/packlets/editing/EditFieldHelpers.js.map +1 -0
  25. package/dist/packlets/editing/MultiActionButton.js.map +1 -0
  26. package/dist/packlets/editing/NumericInput.js.map +1 -0
  27. package/dist/packlets/editing/TypeaheadInput.js.map +1 -0
  28. package/dist/packlets/editing/index.js.map +1 -0
  29. package/dist/packlets/editing/useTypeaheadMatch.js.map +1 -0
  30. package/dist/packlets/keyboard/index.js.map +1 -0
  31. package/dist/packlets/keyboard/registry.js.map +1 -0
  32. package/dist/packlets/keyboard/useKeyboardShortcuts.js.map +1 -0
  33. package/dist/packlets/messages/MessagesContext.js.map +1 -0
  34. package/dist/packlets/messages/MessagesLogger.js.map +1 -0
  35. package/dist/packlets/messages/StatusBar.js.map +1 -0
  36. package/dist/packlets/messages/Toast.js.map +1 -0
  37. package/dist/packlets/messages/index.js.map +1 -0
  38. package/dist/packlets/messages/model.js.map +1 -0
  39. package/dist/packlets/messages/useLogReporter.js.map +1 -0
  40. package/dist/packlets/modal/ConfirmDialog.js.map +1 -0
  41. package/dist/packlets/modal/Modal.js.map +1 -0
  42. package/dist/packlets/modal/index.js.map +1 -0
  43. package/dist/packlets/print/PrintEnclosure.js.map +1 -0
  44. package/dist/packlets/print/index.js.map +1 -0
  45. package/dist/packlets/print/openPrintWindow.js.map +1 -0
  46. package/dist/packlets/responsive/ResponsiveProvider.js.map +1 -0
  47. package/dist/packlets/responsive/index.js.map +1 -0
  48. package/dist/packlets/responsive/useResponsiveLayout.js.map +1 -0
  49. package/dist/packlets/selectors/EntityRow.js.map +1 -0
  50. package/dist/packlets/selectors/PreferredSelector.js.map +1 -0
  51. package/dist/packlets/selectors/index.js.map +1 -0
  52. package/dist/packlets/sidebar/CollectionSection.js +158 -43
  53. package/dist/packlets/sidebar/CollectionSection.js.map +1 -0
  54. package/dist/packlets/sidebar/EntityList.js.map +1 -0
  55. package/dist/packlets/sidebar/FilterBar.js.map +1 -0
  56. package/dist/packlets/sidebar/FilterRow.js.map +1 -0
  57. package/dist/packlets/sidebar/GroupedEntityList.js.map +1 -0
  58. package/dist/packlets/sidebar/SearchBar.js.map +1 -0
  59. package/dist/packlets/sidebar/SidebarLayout.js.map +1 -0
  60. package/dist/packlets/sidebar/index.js.map +1 -0
  61. package/dist/packlets/theme/ThemeProvider.js.map +1 -0
  62. package/dist/packlets/theme/index.js.map +1 -0
  63. package/dist/packlets/top-bar/ModeSelector.js.map +1 -0
  64. package/dist/packlets/top-bar/TabBar.js +4 -1
  65. package/dist/packlets/top-bar/TabBar.js.map +1 -0
  66. package/dist/packlets/top-bar/index.js.map +1 -0
  67. package/dist/packlets/url-sync/index.js.map +1 -0
  68. package/dist/packlets/url-sync/useUrlSync.js.map +1 -0
  69. package/dist/styles/theme.css +194 -0
  70. package/lib/index.browser.d.ts.map +1 -0
  71. package/lib/index.browser.js.map +1 -0
  72. package/lib/index.d.ts.map +1 -0
  73. package/lib/index.js.map +1 -0
  74. package/lib/packlets/ai-assist/index.d.ts.map +1 -0
  75. package/lib/packlets/ai-assist/index.js.map +1 -0
  76. package/lib/packlets/ai-assist/useAiAssist.d.ts +26 -0
  77. package/lib/packlets/ai-assist/useAiAssist.d.ts.map +1 -0
  78. package/lib/packlets/ai-assist/useAiAssist.js +216 -15
  79. package/lib/packlets/ai-assist/useAiAssist.js.map +1 -0
  80. package/lib/packlets/badge/index.d.ts +2 -0
  81. package/lib/packlets/badge/index.d.ts.map +1 -0
  82. package/lib/packlets/badge/index.js +27 -0
  83. package/lib/packlets/badge/index.js.map +1 -0
  84. package/lib/packlets/badge/renderStatusBadge.d.ts +11 -0
  85. package/lib/packlets/badge/renderStatusBadge.d.ts.map +1 -0
  86. package/lib/packlets/badge/renderStatusBadge.js +50 -0
  87. package/lib/packlets/badge/renderStatusBadge.js.map +1 -0
  88. package/lib/packlets/cascade/CascadeContainer.d.ts.map +1 -0
  89. package/lib/packlets/cascade/CascadeContainer.js.map +1 -0
  90. package/lib/packlets/cascade/ComparisonView.d.ts.map +1 -0
  91. package/lib/packlets/cascade/ComparisonView.js.map +1 -0
  92. package/lib/packlets/cascade/EntityTabLayout.d.ts.map +1 -0
  93. package/lib/packlets/cascade/EntityTabLayout.js.map +1 -0
  94. package/lib/packlets/cascade/MobileCascadeStack.d.ts.map +1 -0
  95. package/lib/packlets/cascade/MobileCascadeStack.js.map +1 -0
  96. package/lib/packlets/cascade/index.d.ts.map +1 -0
  97. package/lib/packlets/cascade/index.js.map +1 -0
  98. package/lib/packlets/cascade/model.d.ts.map +1 -0
  99. package/lib/packlets/cascade/model.js.map +1 -0
  100. package/lib/packlets/cascade/useCascadeOps.d.ts.map +1 -0
  101. package/lib/packlets/cascade/useCascadeOps.js.map +1 -0
  102. package/lib/packlets/cascade/useCascadeTransitions.d.ts.map +1 -0
  103. package/lib/packlets/cascade/useCascadeTransitions.js.map +1 -0
  104. package/lib/packlets/detail/DetailHelpers.d.ts.map +1 -0
  105. package/lib/packlets/detail/DetailHelpers.js.map +1 -0
  106. package/lib/packlets/detail/index.d.ts.map +1 -0
  107. package/lib/packlets/detail/index.js.map +1 -0
  108. package/lib/packlets/drop-zone/JsonDropZone.d.ts.map +1 -0
  109. package/lib/packlets/drop-zone/JsonDropZone.js.map +1 -0
  110. package/lib/packlets/drop-zone/index.d.ts.map +1 -0
  111. package/lib/packlets/drop-zone/index.js.map +1 -0
  112. package/lib/packlets/editing/EditFieldHelpers.d.ts +6 -2
  113. package/lib/packlets/editing/EditFieldHelpers.d.ts.map +1 -0
  114. package/lib/packlets/editing/EditFieldHelpers.js +4 -4
  115. package/lib/packlets/editing/EditFieldHelpers.js.map +1 -0
  116. package/lib/packlets/editing/MultiActionButton.d.ts.map +1 -0
  117. package/lib/packlets/editing/MultiActionButton.js.map +1 -0
  118. package/lib/packlets/editing/NumericInput.d.ts.map +1 -0
  119. package/lib/packlets/editing/NumericInput.js.map +1 -0
  120. package/lib/packlets/editing/TypeaheadInput.d.ts.map +1 -0
  121. package/lib/packlets/editing/TypeaheadInput.js.map +1 -0
  122. package/lib/packlets/editing/index.d.ts.map +1 -0
  123. package/lib/packlets/editing/index.js.map +1 -0
  124. package/lib/packlets/editing/useTypeaheadMatch.d.ts.map +1 -0
  125. package/lib/packlets/editing/useTypeaheadMatch.js.map +1 -0
  126. package/lib/packlets/keyboard/index.d.ts.map +1 -0
  127. package/lib/packlets/keyboard/index.js.map +1 -0
  128. package/lib/packlets/keyboard/registry.d.ts.map +1 -0
  129. package/lib/packlets/keyboard/registry.js.map +1 -0
  130. package/lib/packlets/keyboard/useKeyboardShortcuts.d.ts.map +1 -0
  131. package/lib/packlets/keyboard/useKeyboardShortcuts.js.map +1 -0
  132. package/lib/packlets/messages/MessagesContext.d.ts.map +1 -0
  133. package/lib/packlets/messages/MessagesContext.js.map +1 -0
  134. package/lib/packlets/messages/MessagesLogger.d.ts.map +1 -0
  135. package/lib/packlets/messages/MessagesLogger.js.map +1 -0
  136. package/lib/packlets/messages/StatusBar.d.ts.map +1 -0
  137. package/lib/packlets/messages/StatusBar.js.map +1 -0
  138. package/lib/packlets/messages/Toast.d.ts.map +1 -0
  139. package/lib/packlets/messages/Toast.js.map +1 -0
  140. package/lib/packlets/messages/index.d.ts.map +1 -0
  141. package/lib/packlets/messages/index.js.map +1 -0
  142. package/lib/packlets/messages/model.d.ts.map +1 -0
  143. package/lib/packlets/messages/model.js.map +1 -0
  144. package/lib/packlets/messages/useLogReporter.d.ts.map +1 -0
  145. package/lib/packlets/messages/useLogReporter.js.map +1 -0
  146. package/lib/packlets/modal/ConfirmDialog.d.ts.map +1 -0
  147. package/lib/packlets/modal/ConfirmDialog.js.map +1 -0
  148. package/lib/packlets/modal/Modal.d.ts.map +1 -0
  149. package/lib/packlets/modal/Modal.js.map +1 -0
  150. package/lib/packlets/modal/index.d.ts.map +1 -0
  151. package/lib/packlets/modal/index.js.map +1 -0
  152. package/lib/packlets/print/PrintEnclosure.d.ts.map +1 -0
  153. package/lib/packlets/print/PrintEnclosure.js.map +1 -0
  154. package/lib/packlets/print/index.d.ts.map +1 -0
  155. package/lib/packlets/print/index.js.map +1 -0
  156. package/lib/packlets/print/openPrintWindow.d.ts.map +1 -0
  157. package/lib/packlets/print/openPrintWindow.js.map +1 -0
  158. package/lib/packlets/responsive/ResponsiveProvider.d.ts.map +1 -0
  159. package/lib/packlets/responsive/ResponsiveProvider.js.map +1 -0
  160. package/lib/packlets/responsive/index.d.ts.map +1 -0
  161. package/lib/packlets/responsive/index.js.map +1 -0
  162. package/lib/packlets/responsive/useResponsiveLayout.d.ts.map +1 -0
  163. package/lib/packlets/responsive/useResponsiveLayout.js.map +1 -0
  164. package/lib/packlets/selectors/EntityRow.d.ts.map +1 -0
  165. package/lib/packlets/selectors/EntityRow.js.map +1 -0
  166. package/lib/packlets/selectors/PreferredSelector.d.ts.map +1 -0
  167. package/lib/packlets/selectors/PreferredSelector.js.map +1 -0
  168. package/lib/packlets/selectors/index.d.ts.map +1 -0
  169. package/lib/packlets/selectors/index.js.map +1 -0
  170. package/lib/packlets/sidebar/CollectionSection.d.ts +40 -2
  171. package/lib/packlets/sidebar/CollectionSection.d.ts.map +1 -0
  172. package/lib/packlets/sidebar/CollectionSection.js +157 -42
  173. package/lib/packlets/sidebar/CollectionSection.js.map +1 -0
  174. package/lib/packlets/sidebar/EntityList.d.ts.map +1 -0
  175. package/lib/packlets/sidebar/EntityList.js.map +1 -0
  176. package/lib/packlets/sidebar/FilterBar.d.ts.map +1 -0
  177. package/lib/packlets/sidebar/FilterBar.js.map +1 -0
  178. package/lib/packlets/sidebar/FilterRow.d.ts.map +1 -0
  179. package/lib/packlets/sidebar/FilterRow.js.map +1 -0
  180. package/lib/packlets/sidebar/GroupedEntityList.d.ts.map +1 -0
  181. package/lib/packlets/sidebar/GroupedEntityList.js.map +1 -0
  182. package/lib/packlets/sidebar/SearchBar.d.ts.map +1 -0
  183. package/lib/packlets/sidebar/SearchBar.js.map +1 -0
  184. package/lib/packlets/sidebar/SidebarLayout.d.ts.map +1 -0
  185. package/lib/packlets/sidebar/SidebarLayout.js.map +1 -0
  186. package/lib/packlets/sidebar/index.d.ts +1 -1
  187. package/lib/packlets/sidebar/index.d.ts.map +1 -0
  188. package/lib/packlets/sidebar/index.js.map +1 -0
  189. package/lib/packlets/theme/ThemeProvider.d.ts.map +1 -0
  190. package/lib/packlets/theme/ThemeProvider.js.map +1 -0
  191. package/lib/packlets/theme/index.d.ts.map +1 -0
  192. package/lib/packlets/theme/index.js.map +1 -0
  193. package/lib/packlets/top-bar/ModeSelector.d.ts.map +1 -0
  194. package/lib/packlets/top-bar/ModeSelector.js.map +1 -0
  195. package/lib/packlets/top-bar/TabBar.d.ts +12 -0
  196. package/lib/packlets/top-bar/TabBar.d.ts.map +1 -0
  197. package/lib/packlets/top-bar/TabBar.js +4 -1
  198. package/lib/packlets/top-bar/TabBar.js.map +1 -0
  199. package/lib/packlets/top-bar/index.d.ts +1 -1
  200. package/lib/packlets/top-bar/index.d.ts.map +1 -0
  201. package/lib/packlets/top-bar/index.js.map +1 -0
  202. package/lib/packlets/url-sync/index.d.ts.map +1 -0
  203. package/lib/packlets/url-sync/index.js.map +1 -0
  204. package/lib/packlets/url-sync/useUrlSync.d.ts.map +1 -0
  205. package/lib/packlets/url-sync/useUrlSync.js.map +1 -0
  206. package/lib/styles/theme.css +194 -0
  207. package/package.json +13 -9
  208. package/tailwind-preset.cjs +102 -0
@@ -0,0 +1,194 @@
1
+ /*
2
+ * @fgv/ts-app-shell — Default theme
3
+ *
4
+ * Defines all semantic design tokens as CSS custom properties.
5
+ * Import this file once at your application entry point:
6
+ *
7
+ * import '@fgv/ts-app-shell/theme.css';
8
+ *
9
+ * Then add the Tailwind preset in your tailwind.config.js:
10
+ *
11
+ * const appShellPreset = require('@fgv/ts-app-shell/tailwind-preset');
12
+ * module.exports = { presets: [appShellPreset], ... };
13
+ *
14
+ * Dark mode: put class="dark" on <html> (or any ancestor).
15
+ * The ThemeProvider component handles this automatically.
16
+ *
17
+ * All variables use the --fgv- prefix and can be overridden by the consumer.
18
+ */
19
+
20
+ /* ============================================================
21
+ * LIGHT MODE (default / :root)
22
+ * ============================================================ */
23
+ :root {
24
+ /* --- Surfaces --- */
25
+ /* Base application surface (page background) */
26
+ --fgv-surface: #ffffff;
27
+ /* Slightly elevated surface (cards, panels) */
28
+ --fgv-surface-raised: #f3f4f6;
29
+ /* Alternate surface (zebra rows, secondary panels) */
30
+ --fgv-surface-alt: #f9fafb;
31
+ /* Modal / dialog backdrop overlay */
32
+ --fgv-backdrop: rgba(0, 0, 0, 0.45);
33
+ /* Hover highlight background (subtle, interactive rows) */
34
+ --fgv-hover: #f3f4f6;
35
+ /* Selected item background (listbox rows, picker items) */
36
+ --fgv-selected: #eff6ff;
37
+
38
+ /* --- Text --- */
39
+ /* High-emphasis body text — minimum 7:1 on --fgv-surface (WCAG AAA) */
40
+ --fgv-text-primary: #111827;
41
+ /* Medium-emphasis secondary text — ~5.4:1 on #fff (WCAG AA) */
42
+ --fgv-text-secondary: #374151;
43
+ /* De-emphasized muted text — ~3.5:1, use only for decorative / supporting copy */
44
+ --fgv-text-muted: #6b7280;
45
+ /* Faintest ghost text — intentionally low contrast, only for truly ornamental content */
46
+ --fgv-text-faint: #9ca3af;
47
+ /* Star / favorite accent (golden) */
48
+ --fgv-text-star: #d97706;
49
+
50
+ /* --- Borders --- */
51
+ /* Default divider / input border */
52
+ --fgv-border: #d1d5db;
53
+ /* Subtle divider (row separators, inner section borders) */
54
+ --fgv-border-subtle: #e5e7eb;
55
+
56
+ /* --- Brand colors --- */
57
+ /* Primary action color (buttons, active nav, links) */
58
+ --fgv-brand-primary: #2563eb;
59
+ /* Darker tonal variant (pressed state, dark top-bar) */
60
+ --fgv-brand-secondary: #1d4ed8;
61
+ /* Accent / highlight (hover text on dark surfaces, checkmarks) */
62
+ --fgv-brand-accent: #3b82f6;
63
+
64
+ /* --- Focus ring --- */
65
+ --fgv-focus-ring: #3b82f6;
66
+ /* Selected item left-border accent */
67
+ --fgv-selected-border: #2563eb;
68
+
69
+ /* --- Status: error / danger --- */
70
+ --fgv-status-error-bg: #fef2f2;
71
+ --fgv-status-error-surface: #fee2e2;
72
+ --fgv-status-error-btn: #dc2626;
73
+ --fgv-status-error-btn-hover: #b91c1c;
74
+ --fgv-status-error-icon: #dc2626;
75
+ --fgv-status-error-border: #fca5a5;
76
+ --fgv-status-error-accent: #ef4444;
77
+ --fgv-status-error-text: #b91c1c;
78
+ --fgv-status-error-strong: #991b1b;
79
+
80
+ /* --- Status: warning --- */
81
+ --fgv-status-warning-bg: #fffbeb;
82
+ --fgv-status-warning-surface: #fef3c7;
83
+ --fgv-status-warning-btn: #d97706;
84
+ --fgv-status-warning-btn-hover: #b45309;
85
+ --fgv-status-warning-icon: #d97706;
86
+ --fgv-status-warning-border: #fcd34d;
87
+ --fgv-status-warning-accent: #f59e0b;
88
+ --fgv-status-warning-text: #92400e;
89
+ --fgv-status-warning-strong: #78350f;
90
+
91
+ /* --- Status: info --- */
92
+ --fgv-status-info-bg: #eff6ff;
93
+ --fgv-status-info-surface: #dbeafe;
94
+ --fgv-status-info-btn: #2563eb;
95
+ --fgv-status-info-btn-hover: #1d4ed8;
96
+ --fgv-status-info-icon: #3b82f6;
97
+ --fgv-status-info-border: #93c5fd;
98
+ --fgv-status-info-accent: #60a5fa;
99
+ --fgv-status-info-text: #1e40af;
100
+ --fgv-status-info-strong: #1e3a8a;
101
+
102
+ /* --- Status: success --- */
103
+ --fgv-status-success-bg: #f0fdf4;
104
+ --fgv-status-success-surface: #dcfce7;
105
+ --fgv-status-success-btn: #16a34a;
106
+ --fgv-status-success-btn-hover: #15803d;
107
+ --fgv-status-success-icon: #16a34a;
108
+ --fgv-status-success-border: #86efac;
109
+ --fgv-status-success-accent: #4ade80;
110
+ --fgv-status-success-text: #166534;
111
+ --fgv-status-success-strong: #14532d;
112
+ }
113
+
114
+ /* ============================================================
115
+ * DARK MODE (.dark on any ancestor element)
116
+ * ============================================================ */
117
+ .dark {
118
+ /* --- Surfaces --- */
119
+ --fgv-surface: #1f2937;
120
+ --fgv-surface-raised: #374151;
121
+ --fgv-surface-alt: #111827;
122
+ --fgv-backdrop: rgba(0, 0, 0, 0.65);
123
+ --fgv-hover: #374151;
124
+ --fgv-selected: #1e3a5f;
125
+
126
+ /* --- Text --- */
127
+ /* ~14:1 on --fgv-surface dark (WCAG AAA) */
128
+ --fgv-text-primary: #f9fafb;
129
+ /* ~8:1 on dark surface (WCAG AA) */
130
+ --fgv-text-secondary: #d1d5db;
131
+ /* ~4.5:1 on dark surface (WCAG AA) */
132
+ --fgv-text-muted: #9ca3af;
133
+ /* Faint ghost text — intentionally low contrast */
134
+ --fgv-text-faint: #6b7280;
135
+ /* Star accent — brightened slightly for dark bg */
136
+ --fgv-text-star: #fbbf24;
137
+
138
+ /* --- Borders --- */
139
+ --fgv-border: #4b5563;
140
+ --fgv-border-subtle: #374151;
141
+
142
+ /* --- Brand colors --- */
143
+ --fgv-brand-primary: #3b82f6;
144
+ --fgv-brand-secondary: #1e3a5f;
145
+ --fgv-brand-accent: #60a5fa;
146
+
147
+ /* --- Focus ring --- */
148
+ --fgv-focus-ring: #60a5fa;
149
+ --fgv-selected-border: #3b82f6;
150
+
151
+ /* --- Status: error / danger --- */
152
+ --fgv-status-error-bg: #450a0a;
153
+ --fgv-status-error-surface: #7f1d1d;
154
+ --fgv-status-error-btn: #dc2626;
155
+ --fgv-status-error-btn-hover: #b91c1c;
156
+ --fgv-status-error-icon: #f87171;
157
+ --fgv-status-error-border: #7f1d1d;
158
+ --fgv-status-error-accent: #ef4444;
159
+ --fgv-status-error-text: #fca5a5;
160
+ --fgv-status-error-strong: #fecaca;
161
+
162
+ /* --- Status: warning --- */
163
+ --fgv-status-warning-bg: #451a03;
164
+ --fgv-status-warning-surface: #78350f;
165
+ --fgv-status-warning-btn: #d97706;
166
+ --fgv-status-warning-btn-hover: #b45309;
167
+ --fgv-status-warning-icon: #fbbf24;
168
+ --fgv-status-warning-border: #78350f;
169
+ --fgv-status-warning-accent: #f59e0b;
170
+ --fgv-status-warning-text: #fde68a;
171
+ --fgv-status-warning-strong: #fef3c7;
172
+
173
+ /* --- Status: info --- */
174
+ --fgv-status-info-bg: #0c1d3e;
175
+ --fgv-status-info-surface: #1e3a5f;
176
+ --fgv-status-info-btn: #3b82f6;
177
+ --fgv-status-info-btn-hover: #2563eb;
178
+ --fgv-status-info-icon: #60a5fa;
179
+ --fgv-status-info-border: #1e3a5f;
180
+ --fgv-status-info-accent: #93c5fd;
181
+ --fgv-status-info-text: #bfdbfe;
182
+ --fgv-status-info-strong: #dbeafe;
183
+
184
+ /* --- Status: success --- */
185
+ --fgv-status-success-bg: #052e16;
186
+ --fgv-status-success-surface: #14532d;
187
+ --fgv-status-success-btn: #16a34a;
188
+ --fgv-status-success-btn-hover: #15803d;
189
+ --fgv-status-success-icon: #4ade80;
190
+ --fgv-status-success-border: #14532d;
191
+ --fgv-status-success-accent: #86efac;
192
+ --fgv-status-success-text: #bbf7d0;
193
+ --fgv-status-success-strong: #dcfce7;
194
+ }
package/package.json CHANGED
@@ -1,10 +1,12 @@
1
1
  {
2
2
  "name": "@fgv/ts-app-shell",
3
- "version": "5.1.0-3",
3
+ "version": "5.1.0-31",
4
4
  "description": "Shared React UI primitives for application shells: column cascade, sidebar, toast/log messages, command palette, keybinding registry",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
7
- "sideEffects": false,
7
+ "sideEffects": [
8
+ "**/*.css"
9
+ ],
8
10
  "keywords": [
9
11
  "typescript",
10
12
  "react",
@@ -17,8 +19,8 @@
17
19
  "dependencies": {
18
20
  "@heroicons/react": "~2.2.0",
19
21
  "tslib": "^2.8.1",
20
- "@fgv/ts-utils": "5.1.0-3",
21
- "@fgv/ts-extras": "5.1.0-3"
22
+ "@fgv/ts-utils": "5.1.0-31",
23
+ "@fgv/ts-extras": "5.1.0-31"
22
24
  },
23
25
  "peerDependencies": {
24
26
  "react": ">=18.0.0",
@@ -46,13 +48,13 @@
46
48
  "rimraf": "^6.1.2",
47
49
  "ts-jest": "^29.4.6",
48
50
  "typescript": "5.9.3",
49
- "@rushstack/heft": "1.2.6",
51
+ "@rushstack/heft": "1.2.7",
50
52
  "@rushstack/eslint-config": "4.6.4",
51
53
  "@rushstack/heft-jest-plugin": "1.2.6",
52
54
  "@testing-library/dom": "^10.4.0",
53
- "@rushstack/heft-node-rig": "2.11.26",
54
- "@fgv/ts-utils-jest": "5.1.0-3",
55
- "@fgv/heft-dual-rig": "5.1.0-3"
55
+ "@rushstack/heft-node-rig": "2.11.27",
56
+ "@fgv/heft-dual-rig": "5.1.0-31",
57
+ "@fgv/ts-utils-jest": "5.1.0-31"
56
58
  },
57
59
  "exports": {
58
60
  ".": {
@@ -65,7 +67,9 @@
65
67
  "require": "./lib/index.browser.js"
66
68
  },
67
69
  "types": "lib/index.d.ts"
68
- }
70
+ },
71
+ "./tailwind-preset": "./tailwind-preset.cjs",
72
+ "./theme.css": "./lib/styles/theme.css"
69
73
  },
70
74
  "repository": {
71
75
  "type": "git",
@@ -0,0 +1,102 @@
1
+ /**
2
+ * @fgv/ts-app-shell — Tailwind CSS preset
3
+ *
4
+ * Maps the package's semantic design tokens to the CSS custom properties
5
+ * defined in theme.css. Add this preset to your tailwind.config.js and
6
+ * import theme.css once at your application entry point.
7
+ *
8
+ * Usage:
9
+ *
10
+ * // tailwind.config.js
11
+ * const appShellPreset = require('@fgv/ts-app-shell/tailwind-preset');
12
+ * module.exports = {
13
+ * presets: [appShellPreset],
14
+ * content: ['./src/**\/*.{ts,tsx}', './node_modules/@fgv/ts-app-shell/lib/**\/*.{js,jsx}'],
15
+ * // ...your config
16
+ * };
17
+ *
18
+ * // application entry (e.g. main.tsx or index.css)
19
+ * import '@fgv/ts-app-shell/theme.css';
20
+ *
21
+ * // dark mode: add class="dark" to <html> (ThemeProvider does this automatically)
22
+ */
23
+
24
+ /** @type {import('tailwindcss').Config} */
25
+ module.exports = {
26
+ darkMode: 'class',
27
+ theme: {
28
+ extend: {
29
+ colors: {
30
+ /* ----- Surfaces ----- */
31
+ surface: 'var(--fgv-surface)',
32
+ 'surface-raised': 'var(--fgv-surface-raised)',
33
+ 'surface-alt': 'var(--fgv-surface-alt)',
34
+ backdrop: 'var(--fgv-backdrop)',
35
+ hover: 'var(--fgv-hover)',
36
+ selected: 'var(--fgv-selected)',
37
+
38
+ /* ----- Text ----- */
39
+ primary: 'var(--fgv-text-primary)',
40
+ secondary: 'var(--fgv-text-secondary)',
41
+ muted: 'var(--fgv-text-muted)',
42
+ faint: 'var(--fgv-text-faint)',
43
+ star: 'var(--fgv-text-star)',
44
+
45
+ /* ----- Borders ----- */
46
+ border: 'var(--fgv-border)',
47
+ 'border-subtle': 'var(--fgv-border-subtle)',
48
+ 'focus-ring': 'var(--fgv-focus-ring)',
49
+ 'selected-border': 'var(--fgv-selected-border)',
50
+
51
+ /* ----- Brand ----- */
52
+ 'brand-primary': 'var(--fgv-brand-primary)',
53
+ 'brand-secondary': 'var(--fgv-brand-secondary)',
54
+ 'brand-accent': 'var(--fgv-brand-accent)',
55
+
56
+ /* ----- Status: error / danger ----- */
57
+ 'status-error-bg': 'var(--fgv-status-error-bg)',
58
+ 'status-error-surface': 'var(--fgv-status-error-surface)',
59
+ 'status-error-btn': 'var(--fgv-status-error-btn)',
60
+ 'status-error-btn-hover': 'var(--fgv-status-error-btn-hover)',
61
+ 'status-error-icon': 'var(--fgv-status-error-icon)',
62
+ 'status-error-border': 'var(--fgv-status-error-border)',
63
+ 'status-error-accent': 'var(--fgv-status-error-accent)',
64
+ 'status-error-text': 'var(--fgv-status-error-text)',
65
+ 'status-error-strong': 'var(--fgv-status-error-strong)',
66
+
67
+ /* ----- Status: warning ----- */
68
+ 'status-warning-bg': 'var(--fgv-status-warning-bg)',
69
+ 'status-warning-surface': 'var(--fgv-status-warning-surface)',
70
+ 'status-warning-btn': 'var(--fgv-status-warning-btn)',
71
+ 'status-warning-btn-hover': 'var(--fgv-status-warning-btn-hover)',
72
+ 'status-warning-icon': 'var(--fgv-status-warning-icon)',
73
+ 'status-warning-border': 'var(--fgv-status-warning-border)',
74
+ 'status-warning-accent': 'var(--fgv-status-warning-accent)',
75
+ 'status-warning-text': 'var(--fgv-status-warning-text)',
76
+ 'status-warning-strong': 'var(--fgv-status-warning-strong)',
77
+
78
+ /* ----- Status: info ----- */
79
+ 'status-info-bg': 'var(--fgv-status-info-bg)',
80
+ 'status-info-surface': 'var(--fgv-status-info-surface)',
81
+ 'status-info-btn': 'var(--fgv-status-info-btn)',
82
+ 'status-info-btn-hover': 'var(--fgv-status-info-btn-hover)',
83
+ 'status-info-icon': 'var(--fgv-status-info-icon)',
84
+ 'status-info-border': 'var(--fgv-status-info-border)',
85
+ 'status-info-accent': 'var(--fgv-status-info-accent)',
86
+ 'status-info-text': 'var(--fgv-status-info-text)',
87
+ 'status-info-strong': 'var(--fgv-status-info-strong)',
88
+
89
+ /* ----- Status: success ----- */
90
+ 'status-success-bg': 'var(--fgv-status-success-bg)',
91
+ 'status-success-surface': 'var(--fgv-status-success-surface)',
92
+ 'status-success-btn': 'var(--fgv-status-success-btn)',
93
+ 'status-success-btn-hover': 'var(--fgv-status-success-btn-hover)',
94
+ 'status-success-icon': 'var(--fgv-status-success-icon)',
95
+ 'status-success-border': 'var(--fgv-status-success-border)',
96
+ 'status-success-accent': 'var(--fgv-status-success-accent)',
97
+ 'status-success-text': 'var(--fgv-status-success-text)',
98
+ 'status-success-strong': 'var(--fgv-status-success-strong)'
99
+ }
100
+ }
101
+ }
102
+ };