@xenosystem/elements-react 0.0.1

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 (153) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +41 -0
  3. package/dist/XenoElement.d.ts +39 -0
  4. package/dist/XenoElement.js +25 -0
  5. package/dist/containers/Avatar.d.ts +42 -0
  6. package/dist/containers/Avatar.js +29 -0
  7. package/dist/containers/Badges.d.ts +61 -0
  8. package/dist/containers/Badges.js +43 -0
  9. package/dist/containers/Card.d.ts +24 -0
  10. package/dist/containers/Card.js +5 -0
  11. package/dist/containers/Chip.d.ts +34 -0
  12. package/dist/containers/Chip.js +17 -0
  13. package/dist/containers/DataTable.d.ts +28 -0
  14. package/dist/containers/DataTable.js +13 -0
  15. package/dist/containers/ListRow.d.ts +37 -0
  16. package/dist/containers/ListRow.js +40 -0
  17. package/dist/containers/MessageBubble.d.ts +33 -0
  18. package/dist/containers/MessageBubble.js +9 -0
  19. package/dist/containers/Panel.d.ts +24 -0
  20. package/dist/containers/Panel.js +6 -0
  21. package/dist/containers/Table.d.ts +39 -0
  22. package/dist/containers/Table.js +20 -0
  23. package/dist/containers/Tile.d.ts +19 -0
  24. package/dist/containers/Tile.js +7 -0
  25. package/dist/content/Callout.d.ts +32 -0
  26. package/dist/content/Callout.js +10 -0
  27. package/dist/content/Caret.d.ts +9 -0
  28. package/dist/content/Caret.js +5 -0
  29. package/dist/content/CodeBlock.d.ts +36 -0
  30. package/dist/content/CodeBlock.js +50 -0
  31. package/dist/content/Collapsible.d.ts +24 -0
  32. package/dist/content/Collapsible.js +19 -0
  33. package/dist/content/InlineCode.d.ts +12 -0
  34. package/dist/content/InlineCode.js +5 -0
  35. package/dist/content/ModelPicker.d.ts +45 -0
  36. package/dist/content/ModelPicker.js +124 -0
  37. package/dist/content/SourceCard.d.ts +23 -0
  38. package/dist/content/SourceCard.js +18 -0
  39. package/dist/content/SourcesDisclosure.d.ts +26 -0
  40. package/dist/content/SourcesDisclosure.js +20 -0
  41. package/dist/controls/Button.d.ts +39 -0
  42. package/dist/controls/Button.js +16 -0
  43. package/dist/controls/ConfirmButton.d.ts +22 -0
  44. package/dist/controls/ConfirmButton.js +22 -0
  45. package/dist/controls/IconButton.d.ts +45 -0
  46. package/dist/controls/IconButton.js +15 -0
  47. package/dist/controls/Switch.d.ts +11 -0
  48. package/dist/controls/Switch.js +23 -0
  49. package/dist/controls/TextInput.d.ts +13 -0
  50. package/dist/controls/TextInput.js +6 -0
  51. package/dist/controls/Textarea.d.ts +8 -0
  52. package/dist/controls/Textarea.js +5 -0
  53. package/dist/controls/ToggleButton.d.ts +23 -0
  54. package/dist/controls/ToggleButton.js +23 -0
  55. package/dist/controls/util.d.ts +48 -0
  56. package/dist/controls/util.js +23 -0
  57. package/dist/forms/Checkbox.d.ts +18 -0
  58. package/dist/forms/Checkbox.js +28 -0
  59. package/dist/forms/RadioGroup.d.ts +51 -0
  60. package/dist/forms/RadioGroup.js +83 -0
  61. package/dist/index.d.ts +75 -0
  62. package/dist/index.js +81 -0
  63. package/dist/layout/ResizablePanel.d.ts +40 -0
  64. package/dist/layout/ResizablePanel.js +108 -0
  65. package/dist/nav/Sidebar.d.ts +60 -0
  66. package/dist/nav/Sidebar.js +84 -0
  67. package/dist/overlays/DateTimePicker.d.ts +71 -0
  68. package/dist/overlays/DateTimePicker.js +191 -0
  69. package/dist/overlays/Menu.d.ts +28 -0
  70. package/dist/overlays/Menu.js +32 -0
  71. package/dist/overlays/MenuItem.d.ts +71 -0
  72. package/dist/overlays/MenuItem.js +15 -0
  73. package/dist/overlays/Modal.d.ts +36 -0
  74. package/dist/overlays/Modal.js +27 -0
  75. package/dist/overlays/PickerField.d.ts +32 -0
  76. package/dist/overlays/PickerField.js +40 -0
  77. package/dist/overlays/PillFilter.d.ts +25 -0
  78. package/dist/overlays/PillFilter.js +41 -0
  79. package/dist/overlays/Popover.d.ts +32 -0
  80. package/dist/overlays/Popover.js +38 -0
  81. package/dist/overlays/Reveal.d.ts +20 -0
  82. package/dist/overlays/Reveal.js +45 -0
  83. package/dist/overlays/SegmentedControl.d.ts +23 -0
  84. package/dist/overlays/SegmentedControl.js +43 -0
  85. package/dist/overlays/Tabs.d.ts +32 -0
  86. package/dist/overlays/Tabs.js +142 -0
  87. package/dist/overlays/Tooltip.d.ts +23 -0
  88. package/dist/overlays/Tooltip.js +61 -0
  89. package/dist/status/ProgressBar.d.ts +20 -0
  90. package/dist/status/ProgressBar.js +11 -0
  91. package/dist/status/Spinner.d.ts +16 -0
  92. package/dist/status/Spinner.js +12 -0
  93. package/dist/status/StatusIndicator.d.ts +19 -0
  94. package/dist/status/StatusIndicator.js +11 -0
  95. package/dist/status/StepTimeline.d.ts +26 -0
  96. package/dist/status/StepTimeline.js +16 -0
  97. package/dist/status/ThinkingCube.d.ts +24 -0
  98. package/dist/status/ThinkingCube.js +11 -0
  99. package/dist/useDialog.d.ts +45 -0
  100. package/dist/useDialog.js +122 -0
  101. package/dist/useGooPill.d.ts +57 -0
  102. package/dist/useGooPill.js +76 -0
  103. package/dist/useMenu.d.ts +50 -0
  104. package/dist/useMenu.js +119 -0
  105. package/dist/useTabs.d.ts +88 -0
  106. package/dist/useTabs.js +93 -0
  107. package/package.json +58 -0
  108. package/src/chrome-separated.css +132 -0
  109. package/src/chrome-unified.css +72 -0
  110. package/src/containers/Badges.css +116 -0
  111. package/src/containers/avatar.css +70 -0
  112. package/src/containers/card.css +75 -0
  113. package/src/containers/chip.css +103 -0
  114. package/src/containers/list-row.css +132 -0
  115. package/src/containers/message-bubble.css +112 -0
  116. package/src/containers/panel.css +120 -0
  117. package/src/containers/table.css +102 -0
  118. package/src/containers/tile.css +17 -0
  119. package/src/content/callout.css +77 -0
  120. package/src/content/caret.css +30 -0
  121. package/src/content/code-block.css +159 -0
  122. package/src/content/collapsible.css +80 -0
  123. package/src/content/inline-code.css +14 -0
  124. package/src/content/model-picker.css +219 -0
  125. package/src/content/source-card.css +99 -0
  126. package/src/content/sources-disclosure.css +118 -0
  127. package/src/controls.css +453 -0
  128. package/src/fonts.css +34 -0
  129. package/src/forms/Checkbox.css +114 -0
  130. package/src/forms/RadioGroup.css +115 -0
  131. package/src/goo.css +97 -0
  132. package/src/icon-motion.css +1909 -0
  133. package/src/layout/ResizablePanel.css +79 -0
  134. package/src/nav/sidebar.css +296 -0
  135. package/src/overlays/date-time-picker.css +238 -0
  136. package/src/overlays/menu.css +195 -0
  137. package/src/overlays/modal.css +167 -0
  138. package/src/overlays/picker-field.css +81 -0
  139. package/src/overlays/pill-filter.css +129 -0
  140. package/src/overlays/reveal.css +56 -0
  141. package/src/overlays/segmented-control.css +185 -0
  142. package/src/overlays/tabs.css +143 -0
  143. package/src/overlays/tooltip.css +126 -0
  144. package/src/scrollbar.css +184 -0
  145. package/src/size.css +179 -0
  146. package/src/status/progress-bar.css +88 -0
  147. package/src/status/spinner.css +33 -0
  148. package/src/status/statusindicator.css +65 -0
  149. package/src/status/steptimeline.css +137 -0
  150. package/src/status/thinkingcube.css +75 -0
  151. package/src/xeno-element.css +60 -0
  152. package/src/xeno-elements.css +71 -0
  153. package/src/xeno-theme.css +99 -0
@@ -0,0 +1,219 @@
1
+ /*
2
+ * <ModelPicker> — a trigger + an absolute panel (tray rows / rail chips). Monochrome shell: hairline
3
+ * borders + one soft (uncoloured) shadow for the panel depth. Only the theme custom properties from
4
+ * xeno-theme.css are used; no literal colours, no hues. Motion is transform/opacity only, gated behind
5
+ * prefers-reduced-motion.
6
+ */
7
+
8
+ .xeno-model-picker {
9
+ position: relative;
10
+ display: inline-flex;
11
+ }
12
+
13
+ /* ── Trigger ─────────────────────────────────────────────────────────────────────── */
14
+ /* Extends .xeno-btn (controls.css) — here we just lay out glyph · label · chevron. */
15
+ .xeno-mp-trigger {
16
+ justify-content: flex-start;
17
+ min-width: 180px;
18
+ max-width: 320px;
19
+ }
20
+ .xeno-mp-label {
21
+ flex: 1;
22
+ min-width: 0;
23
+ overflow: hidden;
24
+ text-align: left;
25
+ text-overflow: ellipsis;
26
+ white-space: nowrap;
27
+ }
28
+ .xeno-mp-placeholder {
29
+ color: var(--xeno-muted);
30
+ font-weight: 400;
31
+ }
32
+ .xeno-mp-chevron {
33
+ display: inline-flex;
34
+ color: var(--xeno-muted);
35
+ transition: transform var(--xeno-dur) var(--xeno-ease);
36
+ }
37
+ .xeno-model-picker[data-open='true'] .xeno-mp-chevron {
38
+ transform: rotate(180deg);
39
+ }
40
+
41
+ /* ── Panel (shared) ──────────────────────────────────────────────────────────────── */
42
+ .xeno-mp-panel {
43
+ position: absolute;
44
+ top: calc(100% + 6px);
45
+ left: 0;
46
+ z-index: 40;
47
+ background: var(--xeno-elevated);
48
+ border: 1px solid var(--xeno-border);
49
+ border-radius: var(--xeno-radius-md);
50
+ box-shadow: 0 8px 24px -6px rgba(0, 0, 0, 0.35);
51
+ outline: none;
52
+ animation: xeno-mp-in var(--xeno-dur) var(--xeno-ease);
53
+ }
54
+ .xeno-mp-panel:focus-visible {
55
+ border-color: var(--xeno-muted);
56
+ }
57
+
58
+ @keyframes xeno-mp-in {
59
+ from {
60
+ opacity: 0;
61
+ transform: translateY(-4px);
62
+ }
63
+ to {
64
+ opacity: 1;
65
+ transform: translateY(0);
66
+ }
67
+ }
68
+
69
+ /* ── Tray layout ─────────────────────────────────────────────────────────────────── */
70
+ .xeno-mp-panel--tray {
71
+ min-width: max(100%, 220px);
72
+ max-height: 320px;
73
+ padding: 4px;
74
+ overflow-y: auto;
75
+ }
76
+ .xeno-mp-group + .xeno-mp-group {
77
+ margin-top: 4px;
78
+ padding-top: 4px;
79
+ border-top: 1px solid var(--xeno-border);
80
+ }
81
+ .xeno-mp-group-label {
82
+ padding: 6px 8px 4px;
83
+ color: var(--xeno-muted);
84
+ font-size: 11px;
85
+ font-weight: 600;
86
+ letter-spacing: 0.06em;
87
+ text-transform: uppercase;
88
+ }
89
+ .xeno-mp-option {
90
+ display: flex;
91
+ align-items: center;
92
+ gap: 8px;
93
+ padding: 7px 8px;
94
+ border-radius: var(--xeno-radius-sm);
95
+ color: var(--xeno-text);
96
+ font-size: 14px;
97
+ cursor: pointer;
98
+ transition: background var(--xeno-dur) ease;
99
+ }
100
+ .xeno-mp-option[data-active='true'] {
101
+ background: var(--xeno-hover);
102
+ }
103
+ .xeno-mp-option[data-selection='on'] {
104
+ background: var(--xeno-control);
105
+ }
106
+ .xeno-mp-check {
107
+ display: inline-flex;
108
+ flex: none;
109
+ width: 16px;
110
+ color: var(--xeno-text);
111
+ }
112
+ .xeno-mp-option-name {
113
+ flex: 1;
114
+ min-width: 0;
115
+ overflow: hidden;
116
+ text-overflow: ellipsis;
117
+ white-space: nowrap;
118
+ }
119
+
120
+ /* ── Rail layout ─────────────────────────────────────────────────────────────────── */
121
+ .xeno-mp-panel--rail {
122
+ min-width: max(100%, 240px);
123
+ max-width: 420px;
124
+ padding: 8px;
125
+ }
126
+ /* Viewport clips the scroller and carries the left/right fade edges. */
127
+ .xeno-mp-rail-viewport {
128
+ position: relative;
129
+ }
130
+ .xeno-mp-rail-viewport::before,
131
+ .xeno-mp-rail-viewport::after {
132
+ content: '';
133
+ position: absolute;
134
+ top: 0;
135
+ bottom: 0;
136
+ width: 20px;
137
+ pointer-events: none;
138
+ z-index: 1;
139
+ }
140
+ .xeno-mp-rail-viewport::before {
141
+ left: 0;
142
+ background: linear-gradient(to right, var(--xeno-elevated), transparent);
143
+ }
144
+ .xeno-mp-rail-viewport::after {
145
+ right: 0;
146
+ background: linear-gradient(to left, var(--xeno-elevated), transparent);
147
+ }
148
+ .xeno-mp-rail {
149
+ display: flex;
150
+ gap: 6px;
151
+ overflow-x: auto;
152
+ padding: 2px 4px;
153
+ scrollbar-width: none;
154
+ }
155
+ .xeno-mp-rail::-webkit-scrollbar {
156
+ display: none;
157
+ }
158
+ .xeno-mp-chip {
159
+ display: inline-flex;
160
+ flex-direction: column;
161
+ align-items: flex-start;
162
+ gap: 1px;
163
+ flex: none;
164
+ position: relative;
165
+ padding: 6px 12px;
166
+ border: 1px solid var(--xeno-border);
167
+ border-radius: var(--xeno-radius-control);
168
+ color: var(--xeno-text);
169
+ cursor: pointer;
170
+ white-space: nowrap;
171
+ transition:
172
+ background var(--xeno-dur) ease,
173
+ border-color var(--xeno-dur) ease;
174
+ }
175
+ .xeno-mp-chip[data-active='true'] {
176
+ background: var(--xeno-hover);
177
+ border-color: var(--xeno-muted);
178
+ }
179
+ .xeno-mp-chip[data-selection='on'] {
180
+ background: var(--xeno-control);
181
+ border-color: var(--xeno-muted);
182
+ padding-right: 26px;
183
+ }
184
+ .xeno-mp-chip-provider {
185
+ color: var(--xeno-muted);
186
+ font-size: 10px;
187
+ font-weight: 600;
188
+ letter-spacing: 0.04em;
189
+ text-transform: uppercase;
190
+ }
191
+ .xeno-mp-chip-label {
192
+ font-size: 13px;
193
+ font-weight: 500;
194
+ line-height: 1.2;
195
+ }
196
+ .xeno-mp-chip-check {
197
+ display: inline-flex;
198
+ position: absolute;
199
+ top: 6px;
200
+ right: 8px;
201
+ color: var(--xeno-text);
202
+ }
203
+
204
+ /* ── Disabled ────────────────────────────────────────────────────────────────────── */
205
+ .xeno-model-picker[data-availability='disabled'] {
206
+ opacity: 0.4;
207
+ pointer-events: none;
208
+ }
209
+
210
+ @media (prefers-reduced-motion: reduce) {
211
+ .xeno-mp-chevron,
212
+ .xeno-mp-option,
213
+ .xeno-mp-chip {
214
+ transition: none;
215
+ }
216
+ .xeno-mp-panel {
217
+ animation: none;
218
+ }
219
+ }
@@ -0,0 +1,99 @@
1
+ /*
2
+ * <SourceCard> — a link-embed row. Monochrome shell: card radius, hairline border, hover lifts the
3
+ * border to --xeno-muted. Only theme tokens; motion is transform/opacity behind reduced-motion.
4
+ */
5
+ .xeno-source-card {
6
+ display: flex;
7
+ align-items: flex-start;
8
+ gap: 12px;
9
+ padding: 12px;
10
+ background: var(--xeno-surface);
11
+ border: 1px solid var(--xeno-border);
12
+ border-radius: var(--xeno-radius-card);
13
+ color: var(--xeno-text);
14
+ text-decoration: none;
15
+ transition:
16
+ border-color var(--xeno-dur) var(--xeno-ease),
17
+ background var(--xeno-dur) var(--xeno-ease);
18
+ }
19
+
20
+ a.xeno-source-card {
21
+ cursor: pointer;
22
+ }
23
+ a.xeno-source-card:hover {
24
+ border-color: var(--xeno-muted);
25
+ background: var(--xeno-hover);
26
+ }
27
+ a.xeno-source-card:focus-visible {
28
+ outline: none;
29
+ box-shadow:
30
+ 0 0 0 2px var(--xeno-canvas),
31
+ 0 0 0 4px var(--xeno-border);
32
+ }
33
+
34
+ /* Leading tile — square rounded (radius-md), favicon or domain-initial placeholder. */
35
+ .xeno-source-card-tile {
36
+ flex: none;
37
+ display: inline-flex;
38
+ align-items: center;
39
+ justify-content: center;
40
+ width: 36px;
41
+ height: 36px;
42
+ overflow: hidden;
43
+ background: var(--xeno-control);
44
+ border: 1px solid var(--xeno-border);
45
+ border-radius: var(--xeno-radius-md);
46
+ color: var(--xeno-muted);
47
+ font-size: 15px;
48
+ font-weight: 600;
49
+ line-height: 1;
50
+ user-select: none;
51
+ }
52
+ .xeno-source-card-favicon {
53
+ display: block;
54
+ width: 100%;
55
+ height: 100%;
56
+ object-fit: cover;
57
+ }
58
+
59
+ .xeno-source-card-body {
60
+ display: flex;
61
+ flex: 1;
62
+ min-width: 0;
63
+ flex-direction: column;
64
+ gap: 2px;
65
+ }
66
+ .xeno-source-card-title {
67
+ overflow: hidden;
68
+ color: var(--xeno-text);
69
+ font-size: 14px;
70
+ font-weight: 500;
71
+ line-height: 1.35;
72
+ white-space: nowrap;
73
+ text-overflow: ellipsis;
74
+ }
75
+ .xeno-source-card-domain {
76
+ overflow: hidden;
77
+ color: var(--xeno-muted);
78
+ font-size: 12px;
79
+ line-height: 1.35;
80
+ white-space: nowrap;
81
+ text-overflow: ellipsis;
82
+ }
83
+ .xeno-source-card-snippet {
84
+ display: -webkit-box;
85
+ margin-top: 2px;
86
+ overflow: hidden;
87
+ color: var(--xeno-muted);
88
+ font-size: 13px;
89
+ line-height: 1.45;
90
+ -webkit-line-clamp: 2;
91
+ line-clamp: 2;
92
+ -webkit-box-orient: vertical;
93
+ }
94
+
95
+ @media (prefers-reduced-motion: reduce) {
96
+ .xeno-source-card {
97
+ transition: none;
98
+ }
99
+ }
@@ -0,0 +1,118 @@
1
+ /*
2
+ * <SourcesDisclosure> — a borderless disclosure header (chevron + "Sources" + favicon stack + mono count)
3
+ * over a panel of <SourceCard> rows. Monochrome shell; only theme tokens; motion is transform/opacity.
4
+ */
5
+ .xeno-sources {
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: 8px;
9
+ }
10
+
11
+ /* Header — BORDERLESS, full-width, a text button. */
12
+ .xeno-sources-header {
13
+ display: inline-flex;
14
+ align-items: center;
15
+ gap: 10px;
16
+ width: 100%;
17
+ padding: 6px 4px;
18
+ background: transparent;
19
+ border: none;
20
+ border-radius: var(--xeno-radius-sm);
21
+ color: var(--xeno-text);
22
+ font: inherit;
23
+ text-align: left;
24
+ cursor: pointer;
25
+ transition: color var(--xeno-dur) var(--xeno-ease);
26
+ }
27
+ .xeno-sources-header:hover {
28
+ color: var(--xeno-active);
29
+ }
30
+ .xeno-sources-header:focus-visible {
31
+ outline: none;
32
+ box-shadow:
33
+ 0 0 0 2px var(--xeno-canvas),
34
+ 0 0 0 4px var(--xeno-border);
35
+ }
36
+
37
+ /* Chevron — points right when closed, down when open (root carries the seam). */
38
+ .xeno-sources-chevron {
39
+ display: inline-flex;
40
+ flex: none;
41
+ color: var(--xeno-muted);
42
+ transform: rotate(-90deg);
43
+ transition: transform var(--xeno-dur) var(--xeno-ease);
44
+ }
45
+ .xeno-sources[data-open] .xeno-sources-chevron {
46
+ transform: rotate(0deg);
47
+ }
48
+
49
+ .xeno-sources-label {
50
+ flex: none;
51
+ color: var(--xeno-text);
52
+ font-size: 14px;
53
+ font-weight: 500;
54
+ }
55
+
56
+ /* Overlapping favicon stack — square tiles, -8px overlap, ringed against the surface. */
57
+ .xeno-sources-stack {
58
+ display: inline-flex;
59
+ align-items: center;
60
+ padding-left: 4px;
61
+ }
62
+ .xeno-sources-avatar {
63
+ flex: none;
64
+ display: inline-flex;
65
+ align-items: center;
66
+ justify-content: center;
67
+ width: 20px;
68
+ height: 20px;
69
+ overflow: hidden;
70
+ background: var(--xeno-control);
71
+ border: 1px solid var(--xeno-surface);
72
+ border-radius: var(--xeno-radius-sm);
73
+ color: var(--xeno-muted);
74
+ font-size: 10px;
75
+ font-weight: 600;
76
+ line-height: 1;
77
+ user-select: none;
78
+ }
79
+ .xeno-sources-avatar + .xeno-sources-avatar {
80
+ margin-left: -8px;
81
+ }
82
+ .xeno-sources-avatar img {
83
+ display: block;
84
+ width: 100%;
85
+ height: 100%;
86
+ object-fit: cover;
87
+ }
88
+ .xeno-sources-overflow {
89
+ color: var(--xeno-muted);
90
+ font-size: 9px;
91
+ }
92
+
93
+ /* Count — mono, muted, pushed to the far end. */
94
+ .xeno-sources-count {
95
+ margin-left: auto;
96
+ color: var(--xeno-muted);
97
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
98
+ font-size: 12px;
99
+ font-variant-numeric: tabular-nums;
100
+ }
101
+
102
+ /* Panel — the expanded list of SourceCard rows. */
103
+ .xeno-sources-panel {
104
+ display: flex;
105
+ flex-direction: column;
106
+ gap: 8px;
107
+ padding-left: 4px;
108
+ }
109
+ .xeno-sources-panel[hidden] {
110
+ display: none;
111
+ }
112
+
113
+ @media (prefers-reduced-motion: reduce) {
114
+ .xeno-sources-header,
115
+ .xeno-sources-chevron {
116
+ transition: none;
117
+ }
118
+ }