figrecipe 0.7.4__py3-none-any.whl → 0.9.0__py3-none-any.whl

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 (143) hide show
  1. figrecipe/__init__.py +74 -76
  2. figrecipe/__main__.py +12 -0
  3. figrecipe/_api/_panel.py +67 -0
  4. figrecipe/_api/_save.py +100 -4
  5. figrecipe/_cli/__init__.py +7 -0
  6. figrecipe/_cli/_compose.py +87 -0
  7. figrecipe/_cli/_convert.py +117 -0
  8. figrecipe/_cli/_crop.py +82 -0
  9. figrecipe/_cli/_edit.py +70 -0
  10. figrecipe/_cli/_extract.py +128 -0
  11. figrecipe/_cli/_fonts.py +47 -0
  12. figrecipe/_cli/_info.py +67 -0
  13. figrecipe/_cli/_main.py +58 -0
  14. figrecipe/_cli/_reproduce.py +79 -0
  15. figrecipe/_cli/_style.py +77 -0
  16. figrecipe/_cli/_validate.py +66 -0
  17. figrecipe/_cli/_version.py +50 -0
  18. figrecipe/_composition/__init__.py +32 -0
  19. figrecipe/_composition/_alignment.py +452 -0
  20. figrecipe/_composition/_compose.py +179 -0
  21. figrecipe/_composition/_import_axes.py +127 -0
  22. figrecipe/_composition/_visibility.py +125 -0
  23. figrecipe/_dev/__init__.py +2 -0
  24. figrecipe/_dev/browser/__init__.py +69 -0
  25. figrecipe/_dev/browser/_audio.py +240 -0
  26. figrecipe/_dev/browser/_caption.py +356 -0
  27. figrecipe/_dev/browser/_click_effect.py +146 -0
  28. figrecipe/_dev/browser/_cursor.py +196 -0
  29. figrecipe/_dev/browser/_highlight.py +105 -0
  30. figrecipe/_dev/browser/_narration.py +237 -0
  31. figrecipe/_dev/browser/_recorder.py +446 -0
  32. figrecipe/_dev/browser/_utils.py +178 -0
  33. figrecipe/_dev/browser/_video_trim/__init__.py +152 -0
  34. figrecipe/_dev/browser/_video_trim/_detection.py +223 -0
  35. figrecipe/_dev/browser/_video_trim/_markers.py +140 -0
  36. figrecipe/_editor/__init__.py +36 -36
  37. figrecipe/_editor/_bbox/_extract.py +155 -9
  38. figrecipe/_editor/_bbox/_extract_text.py +124 -0
  39. figrecipe/_editor/_call_overrides.py +183 -0
  40. figrecipe/_editor/_datatable_plot_handlers.py +249 -0
  41. figrecipe/_editor/_figure_layout.py +211 -0
  42. figrecipe/_editor/_flask_app.py +157 -16
  43. figrecipe/_editor/_helpers.py +17 -8
  44. figrecipe/_editor/_hitmap/_detect.py +89 -32
  45. figrecipe/_editor/_hitmap_main.py +4 -4
  46. figrecipe/_editor/_overrides.py +4 -1
  47. figrecipe/_editor/_plot_types_registry.py +190 -0
  48. figrecipe/_editor/_render_overrides.py +38 -11
  49. figrecipe/_editor/_renderer.py +46 -1
  50. figrecipe/_editor/_routes_annotation.py +114 -0
  51. figrecipe/_editor/_routes_axis.py +35 -6
  52. figrecipe/_editor/_routes_captions.py +130 -0
  53. figrecipe/_editor/_routes_composition.py +270 -0
  54. figrecipe/_editor/_routes_core.py +15 -173
  55. figrecipe/_editor/_routes_datatable.py +364 -0
  56. figrecipe/_editor/_routes_element.py +37 -19
  57. figrecipe/_editor/_routes_files.py +443 -0
  58. figrecipe/_editor/_routes_image.py +200 -0
  59. figrecipe/_editor/_routes_snapshot.py +94 -0
  60. figrecipe/_editor/_routes_style.py +28 -8
  61. figrecipe/_editor/_templates/__init__.py +40 -2
  62. figrecipe/_editor/_templates/_html.py +97 -103
  63. figrecipe/_editor/_templates/_html_components/__init__.py +13 -0
  64. figrecipe/_editor/_templates/_html_components/_composition_toolbar.py +79 -0
  65. figrecipe/_editor/_templates/_html_components/_file_browser.py +41 -0
  66. figrecipe/_editor/_templates/_html_datatable.py +92 -0
  67. figrecipe/_editor/_templates/_scripts/__init__.py +58 -0
  68. figrecipe/_editor/_templates/_scripts/_accordion.py +328 -0
  69. figrecipe/_editor/_templates/_scripts/_annotation_drag.py +504 -0
  70. figrecipe/_editor/_templates/_scripts/_api.py +1 -1
  71. figrecipe/_editor/_templates/_scripts/_canvas_context_menu.py +182 -0
  72. figrecipe/_editor/_templates/_scripts/_captions.py +231 -0
  73. figrecipe/_editor/_templates/_scripts/_composition.py +283 -0
  74. figrecipe/_editor/_templates/_scripts/_core.py +94 -37
  75. figrecipe/_editor/_templates/_scripts/_datatable/__init__.py +59 -0
  76. figrecipe/_editor/_templates/_scripts/_datatable/_cell_edit.py +97 -0
  77. figrecipe/_editor/_templates/_scripts/_datatable/_clipboard.py +164 -0
  78. figrecipe/_editor/_templates/_scripts/_datatable/_context_menu.py +221 -0
  79. figrecipe/_editor/_templates/_scripts/_datatable/_core.py +150 -0
  80. figrecipe/_editor/_templates/_scripts/_datatable/_editable.py +511 -0
  81. figrecipe/_editor/_templates/_scripts/_datatable/_import.py +161 -0
  82. figrecipe/_editor/_templates/_scripts/_datatable/_plot.py +261 -0
  83. figrecipe/_editor/_templates/_scripts/_datatable/_selection.py +438 -0
  84. figrecipe/_editor/_templates/_scripts/_datatable/_table.py +256 -0
  85. figrecipe/_editor/_templates/_scripts/_datatable/_tabs.py +354 -0
  86. figrecipe/_editor/_templates/_scripts/_element_editor.py +17 -2
  87. figrecipe/_editor/_templates/_scripts/_files.py +274 -40
  88. figrecipe/_editor/_templates/_scripts/_files_context_menu.py +240 -0
  89. figrecipe/_editor/_templates/_scripts/_hitmap.py +87 -84
  90. figrecipe/_editor/_templates/_scripts/_image_drop.py +428 -0
  91. figrecipe/_editor/_templates/_scripts/_legend_drag.py +5 -0
  92. figrecipe/_editor/_templates/_scripts/_multi_select.py +198 -0
  93. figrecipe/_editor/_templates/_scripts/_panel_drag.py +219 -48
  94. figrecipe/_editor/_templates/_scripts/_panel_drag_snapshot.py +33 -0
  95. figrecipe/_editor/_templates/_scripts/_panel_position.py +238 -54
  96. figrecipe/_editor/_templates/_scripts/_panel_resize.py +230 -0
  97. figrecipe/_editor/_templates/_scripts/_panel_snap.py +307 -0
  98. figrecipe/_editor/_templates/_scripts/_region_select.py +255 -0
  99. figrecipe/_editor/_templates/_scripts/_selection.py +8 -1
  100. figrecipe/_editor/_templates/_scripts/_sync.py +242 -0
  101. figrecipe/_editor/_templates/_scripts/_undo_redo.py +348 -0
  102. figrecipe/_editor/_templates/_scripts/_zoom.py +52 -19
  103. figrecipe/_editor/_templates/_styles/__init__.py +9 -0
  104. figrecipe/_editor/_templates/_styles/_base.py +47 -0
  105. figrecipe/_editor/_templates/_styles/_buttons.py +127 -6
  106. figrecipe/_editor/_templates/_styles/_composition.py +87 -0
  107. figrecipe/_editor/_templates/_styles/_controls.py +168 -3
  108. figrecipe/_editor/_templates/_styles/_datatable/__init__.py +40 -0
  109. figrecipe/_editor/_templates/_styles/_datatable/_editable.py +203 -0
  110. figrecipe/_editor/_templates/_styles/_datatable/_panel.py +268 -0
  111. figrecipe/_editor/_templates/_styles/_datatable/_table.py +479 -0
  112. figrecipe/_editor/_templates/_styles/_datatable/_toolbar.py +384 -0
  113. figrecipe/_editor/_templates/_styles/_datatable/_vars.py +123 -0
  114. figrecipe/_editor/_templates/_styles/_dynamic_props.py +5 -5
  115. figrecipe/_editor/_templates/_styles/_file_browser.py +466 -0
  116. figrecipe/_editor/_templates/_styles/_forms.py +98 -0
  117. figrecipe/_editor/_templates/_styles/_hitmap.py +7 -0
  118. figrecipe/_editor/_templates/_styles/_modals.py +29 -0
  119. figrecipe/_editor/_templates/_styles/_overlays.py +5 -5
  120. figrecipe/_editor/_templates/_styles/_preview.py +213 -8
  121. figrecipe/_editor/_templates/_styles/_spinner.py +117 -0
  122. figrecipe/_editor/static/audio/click.mp3 +0 -0
  123. figrecipe/_editor/static/click.mp3 +0 -0
  124. figrecipe/_editor/static/icons/favicon.ico +0 -0
  125. figrecipe/_integrations/__init__.py +17 -0
  126. figrecipe/_integrations/_scitex_stats.py +298 -0
  127. figrecipe/_params/_DECORATION_METHODS.py +2 -0
  128. figrecipe/_recorder.py +28 -3
  129. figrecipe/_reproducer/_core.py +60 -49
  130. figrecipe/_utils/__init__.py +3 -0
  131. figrecipe/_utils/_bundle.py +205 -0
  132. figrecipe/_wrappers/_axes.py +150 -2
  133. figrecipe/_wrappers/_caption_generator.py +218 -0
  134. figrecipe/_wrappers/_figure.py +26 -1
  135. figrecipe/_wrappers/_stat_annotation.py +274 -0
  136. figrecipe/styles/_style_applier.py +10 -2
  137. figrecipe/styles/presets/SCITEX.yaml +11 -4
  138. {figrecipe-0.7.4.dist-info → figrecipe-0.9.0.dist-info}/METADATA +144 -146
  139. figrecipe-0.9.0.dist-info/RECORD +277 -0
  140. figrecipe-0.9.0.dist-info/entry_points.txt +2 -0
  141. figrecipe-0.7.4.dist-info/RECORD +0 -188
  142. {figrecipe-0.7.4.dist-info → figrecipe-0.9.0.dist-info}/WHEEL +0 -0
  143. {figrecipe-0.7.4.dist-info → figrecipe-0.9.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,203 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """CSS for editable datatable functionality."""
4
+
5
+ CSS_DATATABLE_EDITABLE = """
6
+ /* ============================================================================
7
+ Create New Table Button
8
+ ============================================================================ */
9
+ .datatable-create-new {
10
+ text-align: center;
11
+ padding: 8px;
12
+ border-top: 1px solid var(--dt-border);
13
+ }
14
+
15
+ .btn-create-csv {
16
+ background: var(--dt-accent);
17
+ color: white;
18
+ border: none;
19
+ padding: 8px 16px;
20
+ border-radius: 4px;
21
+ cursor: pointer;
22
+ font-size: 13px;
23
+ transition: background 0.2s;
24
+ }
25
+
26
+ .btn-create-csv:hover {
27
+ background: var(--dt-accent-hover);
28
+ }
29
+
30
+ /* ============================================================================
31
+ Editable Table Styles
32
+ ============================================================================ */
33
+ .editable-table-wrapper {
34
+ display: flex;
35
+ flex-direction: column;
36
+ flex: 1;
37
+ min-height: 0; /* Allow flex shrinking */
38
+ }
39
+
40
+ .editable-table-actions {
41
+ display: flex;
42
+ gap: 4px;
43
+ padding: 4px;
44
+ background: var(--dt-header-bg);
45
+ border-bottom: 1px solid var(--dt-border);
46
+ flex-shrink: 0;
47
+ }
48
+
49
+ .editable-table-actions .btn-small {
50
+ padding: 2px 8px;
51
+ font-size: 11px;
52
+ background: var(--dt-bg);
53
+ border: 1px solid var(--dt-border);
54
+ border-radius: 3px;
55
+ cursor: pointer;
56
+ color: var(--dt-text);
57
+ }
58
+
59
+ .editable-table-actions .btn-small:hover {
60
+ background: var(--dt-row-hover);
61
+ }
62
+
63
+ .editable-table-actions .btn-danger {
64
+ color: #dc3545;
65
+ }
66
+
67
+ .editable-table-actions .btn-danger:hover {
68
+ background: rgba(220, 53, 69, 0.1);
69
+ }
70
+
71
+ /* ============================================================================
72
+ Large Table Performance (inspired by vis_app patterns)
73
+ ============================================================================ */
74
+ /* Table container with scrolling */
75
+ .editable-table-scroll {
76
+ overflow: auto;
77
+ flex: 1;
78
+ min-height: 0; /* Allow flex shrinking */
79
+ }
80
+
81
+ /* Fixed row height for predictable scrolling */
82
+ .datatable-table.editable {
83
+ border-collapse: separate;
84
+ border-spacing: 0;
85
+ }
86
+
87
+ .datatable-table.editable tr {
88
+ height: 28px;
89
+ }
90
+
91
+ /* Sticky header row */
92
+ .datatable-table.editable thead th {
93
+ position: sticky;
94
+ top: 0;
95
+ z-index: 10;
96
+ background: var(--dt-header-bg);
97
+ }
98
+
99
+ /* Sticky row numbers column */
100
+ .datatable-table.editable .row-num {
101
+ position: sticky;
102
+ left: 0;
103
+ z-index: 5;
104
+ background: var(--dt-header-bg);
105
+ }
106
+
107
+ /* Corner cell (row # header) - highest z-index */
108
+ .datatable-table.editable thead th.row-num {
109
+ z-index: 11;
110
+ }
111
+
112
+ /* Editable table specific styles */
113
+ .datatable-table.editable th {
114
+ padding: 2px;
115
+ }
116
+
117
+ .editable-header {
118
+ display: flex;
119
+ align-items: center;
120
+ gap: 2px;
121
+ }
122
+
123
+ .col-name-input {
124
+ flex: 1;
125
+ min-width: 40px;
126
+ max-width: 80px;
127
+ padding: 2px 4px;
128
+ font-size: 11px;
129
+ border: 1px solid transparent;
130
+ background: transparent;
131
+ color: var(--dt-text);
132
+ border-radius: 2px;
133
+ }
134
+
135
+ .col-name-input:hover,
136
+ .col-name-input:focus {
137
+ border-color: var(--dt-accent);
138
+ background: var(--dt-bg);
139
+ outline: none;
140
+ }
141
+
142
+ .col-type-select {
143
+ width: 28px;
144
+ padding: 1px;
145
+ font-size: 10px;
146
+ border: 1px solid var(--dt-border);
147
+ background: var(--dt-bg);
148
+ color: var(--dt-text-muted);
149
+ border-radius: 2px;
150
+ cursor: pointer;
151
+ }
152
+
153
+ .editable-cell {
154
+ padding: 0 !important;
155
+ }
156
+
157
+ .editable-cell input {
158
+ width: 100%;
159
+ padding: 4px 6px;
160
+ font-size: 12px;
161
+ border: none;
162
+ background: transparent;
163
+ color: var(--dt-text);
164
+ box-sizing: border-box;
165
+ }
166
+
167
+ .editable-cell input:hover {
168
+ background: var(--dt-row-hover);
169
+ }
170
+
171
+ .editable-cell input:focus {
172
+ outline: 2px solid var(--dt-accent);
173
+ outline-offset: -2px;
174
+ background: var(--dt-bg);
175
+ }
176
+
177
+ .editable-cell input[type="number"] {
178
+ text-align: right;
179
+ -moz-appearance: textfield; /* Firefox */
180
+ }
181
+
182
+ /* Hide number spinbuttons completely */
183
+ .editable-cell input[type="number"]::-webkit-inner-spin-button,
184
+ .editable-cell input[type="number"]::-webkit-outer-spin-button {
185
+ -webkit-appearance: none;
186
+ margin: 0;
187
+ display: none;
188
+ }
189
+
190
+ /* ============================================================================
191
+ Element Color Indicator on Column Headers
192
+ ============================================================================ */
193
+ .datatable-table.editable th.has-element-color {
194
+ border-left-width: 3px;
195
+ border-left-style: solid;
196
+ /* Color is set via inline style */
197
+ position: relative;
198
+ }
199
+ """
200
+
201
+ __all__ = ["CSS_DATATABLE_EDITABLE"]
202
+
203
+ # EOF
@@ -0,0 +1,268 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """CSS styles for datatable panel layout."""
4
+
5
+ CSS_DATATABLE_PANEL = """
6
+ /* Datatable panel - always visible, collapsible */
7
+ .datatable-panel {
8
+ width: 280px;
9
+ min-width: 200px;
10
+ max-width: 450px;
11
+ background: var(--bg-secondary);
12
+ border-right: 1px solid var(--border-color);
13
+ display: flex;
14
+ flex-direction: column;
15
+ overflow: hidden;
16
+ transition: width 0.2s ease-out, min-width 0.2s ease-out;
17
+ position: relative;
18
+ }
19
+
20
+ /* Collapsed state */
21
+ .datatable-panel.collapsed {
22
+ width: 36px;
23
+ min-width: 36px;
24
+ }
25
+
26
+ .datatable-panel.collapsed .datatable-tabs,
27
+ .datatable-panel.collapsed .datatable-tab-content,
28
+ .datatable-panel.collapsed .datatable-resize {
29
+ display: none;
30
+ }
31
+
32
+ .datatable-panel.collapsed .datatable-header {
33
+ padding: 10px 6px;
34
+ justify-content: center;
35
+ }
36
+
37
+ .datatable-panel.collapsed .datatable-header .header-title {
38
+ display: none;
39
+ }
40
+
41
+ .datatable-panel.collapsed .datatable-header h3,
42
+ .datatable-panel.collapsed .datatable-header span {
43
+ display: none;
44
+ }
45
+
46
+ .datatable-panel.collapsed .datatable-header-actions {
47
+ display: flex;
48
+ }
49
+
50
+ .datatable-panel.collapsed .datatable-header-actions button:not(.btn-collapse) {
51
+ display: none;
52
+ }
53
+
54
+ /* Flip collapse button when collapsed (now points right to expand) */
55
+ .datatable-panel.collapsed .btn-collapse {
56
+ transform: rotate(180deg);
57
+ }
58
+
59
+ /* Resize handle */
60
+ .datatable-resize {
61
+ width: 4px;
62
+ cursor: col-resize;
63
+ background: transparent;
64
+ position: absolute;
65
+ right: 0;
66
+ top: 0;
67
+ bottom: 0;
68
+ z-index: 10;
69
+ transition: background 0.2s;
70
+ }
71
+
72
+ .datatable-resize:hover,
73
+ .datatable-resize.resizing {
74
+ background: var(--accent-color);
75
+ }
76
+
77
+ /* Datatable header */
78
+ .datatable-header {
79
+ padding: 0 10px;
80
+ height: var(--panel-header-height);
81
+ min-height: var(--panel-header-height);
82
+ border-bottom: 1px solid var(--border-color);
83
+ display: flex;
84
+ align-items: center;
85
+ justify-content: space-between;
86
+ flex-shrink: 0;
87
+ background: var(--panel-header-bg);
88
+ }
89
+
90
+ .datatable-header .header-title {
91
+ display: flex;
92
+ align-items: center;
93
+ gap: 6px;
94
+ }
95
+
96
+ .datatable-header h3,
97
+ .datatable-header span {
98
+ font-size: 11px;
99
+ font-weight: 600;
100
+ margin: 0;
101
+ text-transform: uppercase;
102
+ letter-spacing: 0.5px;
103
+ color: var(--text-secondary);
104
+ }
105
+
106
+ .datatable-header-actions {
107
+ display: flex;
108
+ gap: 4px;
109
+ align-items: center;
110
+ }
111
+
112
+ .datatable-header-actions button {
113
+ padding: 4px 8px;
114
+ font-size: 11px;
115
+ background: var(--bg-tertiary);
116
+ border: 1px solid var(--border-color);
117
+ border-radius: 3px;
118
+ cursor: pointer;
119
+ color: var(--text-primary);
120
+ }
121
+
122
+ .datatable-header-actions button:hover {
123
+ background: var(--accent-color);
124
+ color: white;
125
+ border-color: var(--accent-color);
126
+ }
127
+
128
+ .datatable-header-actions .btn-collapse {
129
+ width: 24px;
130
+ height: 24px;
131
+ padding: 0;
132
+ border: none;
133
+ background: transparent;
134
+ color: var(--text-secondary);
135
+ cursor: pointer;
136
+ font-size: 14px;
137
+ display: flex;
138
+ align-items: center;
139
+ justify-content: center;
140
+ border-radius: 4px;
141
+ transition: all 0.2s;
142
+ }
143
+
144
+ .datatable-header-actions .btn-collapse:hover {
145
+ background: var(--bg-primary);
146
+ color: var(--text-primary);
147
+ }
148
+
149
+ .btn-close-datatable {
150
+ background: transparent !important;
151
+ border: none !important;
152
+ font-size: 16px !important;
153
+ padding: 2px 6px !important;
154
+ color: var(--text-secondary) !important;
155
+ }
156
+
157
+ .btn-close-datatable:hover {
158
+ background: var(--bg-tertiary) !important;
159
+ color: var(--text-primary) !important;
160
+ }
161
+
162
+ /* Tab bar for multiple datatables */
163
+ .datatable-tabs {
164
+ display: flex;
165
+ align-items: center;
166
+ border-bottom: 1px solid var(--border-color);
167
+ background: var(--bg-tertiary);
168
+ flex-shrink: 0;
169
+ overflow-x: auto;
170
+ scrollbar-width: thin;
171
+ }
172
+
173
+ .datatable-tab-list {
174
+ display: flex;
175
+ flex: 1;
176
+ overflow-x: auto;
177
+ gap: 0;
178
+ }
179
+
180
+ .datatable-tab {
181
+ padding: 8px 14px;
182
+ font-size: 12px;
183
+ background: transparent;
184
+ border: none;
185
+ border-left: 2px solid transparent;
186
+ cursor: pointer;
187
+ color: var(--text-secondary);
188
+ white-space: nowrap;
189
+ display: flex;
190
+ align-items: center;
191
+ gap: 6px;
192
+ transition: all 0.15s ease;
193
+ }
194
+
195
+ .datatable-tab:hover {
196
+ background: var(--bg-secondary);
197
+ color: var(--text-primary);
198
+ }
199
+
200
+ .datatable-tab.active {
201
+ background: var(--bg-secondary);
202
+ color: var(--element-color, var(--accent-color));
203
+ border-left-color: var(--element-color, var(--accent-color));
204
+ }
205
+
206
+ .datatable-tab .tab-name {
207
+ max-width: 100px;
208
+ overflow: hidden;
209
+ text-overflow: ellipsis;
210
+ }
211
+
212
+ .datatable-tab .tab-close {
213
+ font-size: 14px;
214
+ line-height: 1;
215
+ opacity: 0.5;
216
+ padding: 0 2px;
217
+ }
218
+
219
+ .datatable-tab .tab-close:hover {
220
+ opacity: 1;
221
+ color: #ff6b6b;
222
+ }
223
+
224
+ .datatable-tab .tab-axis {
225
+ font-size: 9px;
226
+ background: var(--element-color, var(--accent-color));
227
+ color: white;
228
+ padding: 1px 4px;
229
+ border-radius: 3px;
230
+ font-weight: 600;
231
+ }
232
+
233
+ .btn-new-tab {
234
+ padding: 6px 10px;
235
+ font-size: 14px;
236
+ font-weight: bold;
237
+ background: transparent;
238
+ border: none;
239
+ cursor: pointer;
240
+ color: var(--text-secondary);
241
+ flex-shrink: 0;
242
+ }
243
+
244
+ .btn-new-tab:hover {
245
+ background: var(--bg-secondary);
246
+ color: var(--accent-color);
247
+ }
248
+
249
+ .datatable-tab-content {
250
+ flex: 1;
251
+ display: flex;
252
+ flex-direction: column;
253
+ overflow: hidden;
254
+ min-height: 0; /* Allow flex shrinking */
255
+ }
256
+
257
+ /* Responsive adjustments */
258
+ @media (max-width: 1200px) {
259
+ .datatable-panel.expanded {
260
+ width: 280px;
261
+ min-width: 280px;
262
+ }
263
+ }
264
+ """
265
+
266
+ __all__ = ["CSS_DATATABLE_PANEL"]
267
+
268
+ # EOF