@roxyapi/ui 0.0.1 → 0.1.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 (166) hide show
  1. package/AGENTS.md +169 -0
  2. package/THEMING.md +129 -0
  3. package/dist/cdn/components/biorhythm-chart.js +261 -0
  4. package/dist/cdn/components/biorhythm-chart.js.map +7 -0
  5. package/dist/cdn/components/compatibility-card.js +257 -0
  6. package/dist/cdn/components/compatibility-card.js.map +7 -0
  7. package/dist/cdn/components/dasha-timeline.js +244 -0
  8. package/dist/cdn/components/dasha-timeline.js.map +7 -0
  9. package/dist/cdn/components/data.js +258 -0
  10. package/dist/cdn/components/data.js.map +7 -0
  11. package/dist/cdn/components/dosha-card.js +254 -0
  12. package/dist/cdn/components/dosha-card.js.map +7 -0
  13. package/dist/cdn/components/endpoint-form.js +253 -0
  14. package/dist/cdn/components/endpoint-form.js.map +7 -0
  15. package/dist/cdn/components/guna-milan.js +256 -0
  16. package/dist/cdn/components/guna-milan.js.map +7 -0
  17. package/dist/cdn/components/hexagram.js +275 -0
  18. package/dist/cdn/components/hexagram.js.map +7 -0
  19. package/dist/cdn/components/horoscope-card.js +302 -0
  20. package/dist/cdn/components/horoscope-card.js.map +7 -0
  21. package/dist/cdn/components/kp-planets-table.js +224 -0
  22. package/dist/cdn/components/kp-planets-table.js.map +7 -0
  23. package/dist/cdn/components/location-search.js +267 -0
  24. package/dist/cdn/components/location-search.js.map +7 -0
  25. package/dist/cdn/components/moon-phase.js +251 -0
  26. package/dist/cdn/components/moon-phase.js.map +7 -0
  27. package/dist/cdn/components/natal-chart.js +237 -0
  28. package/dist/cdn/components/natal-chart.js.map +7 -0
  29. package/dist/cdn/components/numerology-card.js +252 -0
  30. package/dist/cdn/components/numerology-card.js.map +7 -0
  31. package/dist/cdn/components/panchang-table.js +234 -0
  32. package/dist/cdn/components/panchang-table.js.map +7 -0
  33. package/dist/cdn/components/synastry-chart.js +303 -0
  34. package/dist/cdn/components/synastry-chart.js.map +7 -0
  35. package/dist/cdn/components/tarot-card.js +260 -0
  36. package/dist/cdn/components/tarot-card.js.map +7 -0
  37. package/dist/cdn/components/tarot-spread.js +261 -0
  38. package/dist/cdn/components/tarot-spread.js.map +7 -0
  39. package/dist/cdn/components/vedic-kundli.js +189 -0
  40. package/dist/cdn/components/vedic-kundli.js.map +7 -0
  41. package/dist/cdn/roxy-ui.js +2552 -0
  42. package/dist/cdn/roxy-ui.js.map +7 -0
  43. package/dist/cdn/widgets.js +114 -0
  44. package/dist/components/biorhythm-chart.d.ts +66 -0
  45. package/dist/components/biorhythm-chart.d.ts.map +1 -0
  46. package/dist/components/biorhythm-chart.js +318 -0
  47. package/dist/components/biorhythm-chart.js.map +7 -0
  48. package/dist/components/compatibility-card.d.ts +46 -0
  49. package/dist/components/compatibility-card.d.ts.map +1 -0
  50. package/dist/components/compatibility-card.js +279 -0
  51. package/dist/components/compatibility-card.js.map +7 -0
  52. package/dist/components/dasha-timeline.d.ts +53 -0
  53. package/dist/components/dasha-timeline.d.ts.map +1 -0
  54. package/dist/components/dasha-timeline.js +269 -0
  55. package/dist/components/dasha-timeline.js.map +7 -0
  56. package/dist/components/data.d.ts +40 -0
  57. package/dist/components/data.d.ts.map +1 -0
  58. package/dist/components/data.js +339 -0
  59. package/dist/components/data.js.map +7 -0
  60. package/dist/components/dosha-card.d.ts +35 -0
  61. package/dist/components/dosha-card.d.ts.map +1 -0
  62. package/dist/components/dosha-card.js +278 -0
  63. package/dist/components/dosha-card.js.map +7 -0
  64. package/dist/components/endpoint-form.d.ts +39 -0
  65. package/dist/components/endpoint-form.d.ts.map +1 -0
  66. package/dist/components/endpoint-form.js +432 -0
  67. package/dist/components/endpoint-form.js.map +7 -0
  68. package/dist/components/guna-milan.d.ts +35 -0
  69. package/dist/components/guna-milan.d.ts.map +1 -0
  70. package/dist/components/guna-milan.js +302 -0
  71. package/dist/components/guna-milan.js.map +7 -0
  72. package/dist/components/hexagram.d.ts +47 -0
  73. package/dist/components/hexagram.d.ts.map +1 -0
  74. package/dist/components/hexagram.js +334 -0
  75. package/dist/components/hexagram.js.map +7 -0
  76. package/dist/components/horoscope-card.d.ts +38 -0
  77. package/dist/components/horoscope-card.d.ts.map +1 -0
  78. package/dist/components/horoscope-card.js +332 -0
  79. package/dist/components/horoscope-card.js.map +7 -0
  80. package/dist/components/kp-planets-table.d.ts +36 -0
  81. package/dist/components/kp-planets-table.d.ts.map +1 -0
  82. package/dist/components/kp-planets-table.js +227 -0
  83. package/dist/components/kp-planets-table.js.map +7 -0
  84. package/dist/components/location-search.d.ts +56 -0
  85. package/dist/components/location-search.d.ts.map +1 -0
  86. package/dist/components/location-search.js +401 -0
  87. package/dist/components/location-search.js.map +7 -0
  88. package/dist/components/moon-phase.d.ts +38 -0
  89. package/dist/components/moon-phase.d.ts.map +1 -0
  90. package/dist/components/moon-phase.js +284 -0
  91. package/dist/components/moon-phase.js.map +7 -0
  92. package/dist/components/natal-chart.d.ts +65 -0
  93. package/dist/components/natal-chart.d.ts.map +1 -0
  94. package/dist/components/natal-chart.js +407 -0
  95. package/dist/components/natal-chart.js.map +7 -0
  96. package/dist/components/numerology-card.d.ts +55 -0
  97. package/dist/components/numerology-card.d.ts.map +1 -0
  98. package/dist/components/numerology-card.js +274 -0
  99. package/dist/components/numerology-card.js.map +7 -0
  100. package/dist/components/panchang-table.d.ts +77 -0
  101. package/dist/components/panchang-table.d.ts.map +1 -0
  102. package/dist/components/panchang-table.js +285 -0
  103. package/dist/components/panchang-table.js.map +7 -0
  104. package/dist/components/synastry-chart.d.ts +52 -0
  105. package/dist/components/synastry-chart.d.ts.map +1 -0
  106. package/dist/components/synastry-chart.js +415 -0
  107. package/dist/components/synastry-chart.js.map +7 -0
  108. package/dist/components/tarot-card.d.ts +47 -0
  109. package/dist/components/tarot-card.d.ts.map +1 -0
  110. package/dist/components/tarot-card.js +281 -0
  111. package/dist/components/tarot-card.js.map +7 -0
  112. package/dist/components/tarot-spread.d.ts +42 -0
  113. package/dist/components/tarot-spread.d.ts.map +1 -0
  114. package/dist/components/tarot-spread.js +271 -0
  115. package/dist/components/tarot-spread.js.map +7 -0
  116. package/dist/components/vedic-kundli.d.ts +45 -0
  117. package/dist/components/vedic-kundli.d.ts.map +1 -0
  118. package/dist/components/vedic-kundli.js +325 -0
  119. package/dist/components/vedic-kundli.js.map +7 -0
  120. package/dist/index.cjs +4174 -0
  121. package/dist/index.cjs.map +7 -0
  122. package/dist/index.d.ts +30 -0
  123. package/dist/index.d.ts.map +1 -0
  124. package/dist/index.js +4154 -0
  125. package/dist/index.js.map +7 -0
  126. package/dist/manifest.json +24 -0
  127. package/dist/styles/tokens.css +147 -0
  128. package/dist/tokens/index.d.ts +17 -0
  129. package/dist/tokens/index.d.ts.map +1 -0
  130. package/dist/utils/base-styles.d.ts +6 -0
  131. package/dist/utils/base-styles.d.ts.map +1 -0
  132. package/dist/utils/debounce.d.ts +5 -0
  133. package/dist/utils/debounce.d.ts.map +1 -0
  134. package/dist/utils/degree.d.ts +29 -0
  135. package/dist/utils/degree.d.ts.map +1 -0
  136. package/dist/utils/motion.d.ts +13 -0
  137. package/dist/utils/motion.d.ts.map +1 -0
  138. package/package.json +69 -3
  139. package/src/components/biorhythm-chart.ts +290 -0
  140. package/src/components/compatibility-card.ts +231 -0
  141. package/src/components/dasha-timeline.ts +251 -0
  142. package/src/components/data.ts +287 -0
  143. package/src/components/dosha-card.ts +215 -0
  144. package/src/components/endpoint-form.ts +433 -0
  145. package/src/components/guna-milan.ts +245 -0
  146. package/src/components/hexagram.ts +279 -0
  147. package/src/components/horoscope-card.ts +291 -0
  148. package/src/components/kp-planets-table.ts +156 -0
  149. package/src/components/location-search.ts +335 -0
  150. package/src/components/moon-phase.ts +221 -0
  151. package/src/components/natal-chart.ts +298 -0
  152. package/src/components/numerology-card.ts +243 -0
  153. package/src/components/panchang-table.ts +265 -0
  154. package/src/components/synastry-chart.ts +341 -0
  155. package/src/components/tarot-card.ts +235 -0
  156. package/src/components/tarot-spread.ts +224 -0
  157. package/src/components/vedic-kundli.ts +257 -0
  158. package/src/index.ts +61 -0
  159. package/src/styles/tokens.css +147 -0
  160. package/src/tokens/index.ts +130 -0
  161. package/src/types/index.ts +3 -0
  162. package/src/types/types.gen.ts +28526 -0
  163. package/src/utils/base-styles.ts +89 -0
  164. package/src/utils/debounce.ts +13 -0
  165. package/src/utils/degree.ts +64 -0
  166. package/src/utils/motion.ts +18 -0
@@ -0,0 +1,40 @@
1
+ import { LitElement, type TemplateResult } from 'lit';
2
+ /**
3
+ * Generic fallback renderer. Accepts ANY OpenAPI response shape and renders it
4
+ * via field-name heuristics so future spec additions render reasonably without
5
+ * hand-wired components. Mirrors the WordPress GenericRenderer pattern.
6
+ *
7
+ * Heuristic order:
8
+ * 1. Primitive (string, number, boolean) -> single line.
9
+ * 2. Array of primitives -> chip list.
10
+ * 3. Array of objects with shared keys -> table.
11
+ * 4. Object with title-like field -> card with key/value rows.
12
+ * 5. Otherwise -> definition list of all keys.
13
+ *
14
+ * Future spec hint: when the server emits `x-roxy-ui` on a schema, the
15
+ * dispatcher in tool-call (Phase 2.5) will select a hand-tuned component
16
+ * instead of this fallback.
17
+ */
18
+ type Json = string | number | boolean | null | Json[] | {
19
+ [key: string]: Json;
20
+ };
21
+ export declare class RoxyData extends LitElement {
22
+ static styles: import("lit").CSSResult[];
23
+ data: Json;
24
+ render(): TemplateResult<1>;
25
+ private renderValue;
26
+ private renderArray;
27
+ private renderTable;
28
+ private renderObject;
29
+ private renderField;
30
+ private formatPrimitive;
31
+ private collectKeys;
32
+ private humanize;
33
+ }
34
+ declare global {
35
+ interface HTMLElementTagNameMap {
36
+ 'roxy-data': RoxyData;
37
+ }
38
+ }
39
+ export {};
40
+ //# sourceMappingURL=data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/components/data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAW,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAI1E;;;;;;;;;;;;;;;GAeG;AAEH,KAAK,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAMhF,qBACa,QAAS,SAAQ,UAAU;IACvC,MAAM,CAAC,MAAM,4BAiGX;IAGF,IAAI,EAAE,IAAI,CAAQ;IAElB,MAAM;IAYN,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,YAAY;IA+CpB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,QAAQ;CAMhB;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,WAAW,EAAE,QAAQ,CAAC;KACtB;CACD"}
@@ -0,0 +1,339 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result) __defProp(target, key, result);
9
+ return result;
10
+ };
11
+
12
+ // packages/ui/src/components/data.ts
13
+ import { css as css2, html, LitElement, nothing } from "lit";
14
+ import { customElement, property } from "lit/decorators.js";
15
+
16
+ // packages/ui/src/utils/base-styles.ts
17
+ import { css } from "lit";
18
+ var baseStyles = css`
19
+ :host {
20
+ display: block;
21
+ container-type: inline-size;
22
+ font-family: var(
23
+ --roxy-font-sans,
24
+ system-ui,
25
+ -apple-system,
26
+ BlinkMacSystemFont,
27
+ 'Segoe UI',
28
+ Roboto,
29
+ sans-serif
30
+ );
31
+ color: var(--roxy-fg, #0a0a0a);
32
+ background: transparent;
33
+ font-size: var(--roxy-text-base, 1rem);
34
+ line-height: var(--roxy-leading-normal, 1.5);
35
+ animation: roxy-fade-in var(--roxy-motion-duration, 200ms)
36
+ var(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1)) both;
37
+ }
38
+
39
+ *,
40
+ *::before,
41
+ *::after {
42
+ box-sizing: border-box;
43
+ }
44
+
45
+ @keyframes roxy-fade-in {
46
+ from {
47
+ opacity: 0;
48
+ transform: translateY(2px);
49
+ }
50
+ to {
51
+ opacity: 1;
52
+ transform: translateY(0);
53
+ }
54
+ }
55
+
56
+ @media (prefers-reduced-motion: reduce) {
57
+ :host {
58
+ animation: none;
59
+ }
60
+ }
61
+
62
+ .roxy-skeleton {
63
+ background: linear-gradient(
64
+ 90deg,
65
+ var(--roxy-border, #e4e4e7) 0%,
66
+ color-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent) 50%,
67
+ var(--roxy-border, #e4e4e7) 100%
68
+ );
69
+ background-size: 200% 100%;
70
+ animation: roxy-shimmer 1.4s ease-in-out infinite;
71
+ border-radius: var(--roxy-radius-md, 8px);
72
+ }
73
+
74
+ @keyframes roxy-shimmer {
75
+ 0% {
76
+ background-position: 200% 0;
77
+ }
78
+ 100% {
79
+ background-position: -200% 0;
80
+ }
81
+ }
82
+
83
+ @media (prefers-reduced-motion: reduce) {
84
+ .roxy-skeleton {
85
+ animation: none;
86
+ }
87
+ }
88
+
89
+ .roxy-empty {
90
+ padding: var(--roxy-space-lg, 1.5rem);
91
+ color: var(--roxy-muted, #71717a);
92
+ text-align: center;
93
+ font-size: var(--roxy-text-sm, 0.875rem);
94
+ }
95
+
96
+ :host(:focus-within) .roxy-card {
97
+ outline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));
98
+ outline-offset: 2px;
99
+ }
100
+ `;
101
+
102
+ // packages/ui/src/components/data.ts
103
+ var TITLE_KEYS = ["title", "name", "label", "heading", "overview", "summary"];
104
+ var IMAGE_KEYS = ["imageUrl", "image", "icon", "symbol"];
105
+ var SKIP_KEYS = ["imageUrl", "image"];
106
+ var RoxyData = class extends LitElement {
107
+ constructor() {
108
+ super(...arguments);
109
+ this.data = null;
110
+ }
111
+ render() {
112
+ if (this.data == null) {
113
+ return html`<div class="roxy-empty" role="status">No data</div>`;
114
+ }
115
+ return html`<div
116
+ class="roxy-card"
117
+ aria-label="Generic data display"
118
+ >
119
+ ${this.renderValue(this.data)}
120
+ </div>`;
121
+ }
122
+ renderValue(value) {
123
+ if (value === null || value === void 0) return nothing;
124
+ if (typeof value === "string") return html`<p>${value}</p>`;
125
+ if (typeof value === "number" || typeof value === "boolean") {
126
+ return html`<p>${String(value)}</p>`;
127
+ }
128
+ if (Array.isArray(value)) return this.renderArray(value);
129
+ return this.renderObject(value);
130
+ }
131
+ renderArray(arr) {
132
+ if (arr.length === 0) {
133
+ return html`<div class="roxy-empty" role="status">Empty list</div>`;
134
+ }
135
+ const allPrimitive = arr.every(
136
+ (v) => v === null || ["string", "number", "boolean"].includes(typeof v)
137
+ );
138
+ if (allPrimitive) {
139
+ return html`<ul class="roxy-chips">
140
+ ${arr.map((v) => html`<li>${String(v)}</li>`)}
141
+ </ul>`;
142
+ }
143
+ const allObjects = arr.every(
144
+ (v) => v !== null && typeof v === "object" && !Array.isArray(v)
145
+ );
146
+ if (allObjects) return this.renderTable(arr);
147
+ return html`<ol>
148
+ ${arr.map((v) => html`<li>${this.renderValue(v)}</li>`)}
149
+ </ol>`;
150
+ }
151
+ renderTable(rows) {
152
+ const keys = this.collectKeys(rows);
153
+ return html`<table class="roxy-table" role="table">
154
+ <thead>
155
+ <tr>
156
+ ${keys.map((k) => html`<th>${this.humanize(k)}</th>`)}
157
+ </tr>
158
+ </thead>
159
+ <tbody>
160
+ ${rows.map(
161
+ (row) => html`<tr>
162
+ ${keys.map((k) => html`<td>${this.formatPrimitive(row[k])}</td>`)}
163
+ </tr>`
164
+ )}
165
+ </tbody>
166
+ </table>`;
167
+ }
168
+ renderObject(obj) {
169
+ const titleKey = TITLE_KEYS.find((k) => typeof obj[k] === "string");
170
+ const imageKey = IMAGE_KEYS.find(
171
+ (k) => typeof obj[k] === "string" && obj[k].startsWith("http")
172
+ );
173
+ const summaryKey = titleKey !== "summary" && typeof obj.summary === "string" ? "summary" : null;
174
+ const rows = Object.entries(obj).filter(
175
+ ([k, v]) => k !== titleKey && k !== summaryKey && !SKIP_KEYS.includes(k) && v !== null && v !== void 0
176
+ );
177
+ return html`
178
+ ${imageKey ? html`<img
179
+ class="roxy-image"
180
+ src=${String(obj[imageKey])}
181
+ alt=${titleKey ? String(obj[titleKey]) : "illustration"}
182
+ loading="lazy"
183
+ />` : nothing}
184
+ ${titleKey ? html`<h3 class="roxy-title">${obj[titleKey]}</h3>` : nothing}
185
+ ${summaryKey ? html`<p class="roxy-summary">${obj[summaryKey]}</p>` : nothing}
186
+ ${rows.length > 0 ? html`<dl class="roxy-rows">
187
+ ${rows.map(
188
+ ([k, v]) => html`
189
+ <dt>${this.humanize(k)}</dt>
190
+ <dd>${this.renderField(v)}</dd>
191
+ `
192
+ )}
193
+ </dl>` : nothing}
194
+ `;
195
+ }
196
+ renderField(value) {
197
+ if (value === null || value === void 0) return "";
198
+ if (typeof value === "string") return value;
199
+ if (typeof value === "number" || typeof value === "boolean")
200
+ return String(value);
201
+ if (Array.isArray(value)) {
202
+ const allPrimitive = value.every(
203
+ (v) => ["string", "number", "boolean"].includes(typeof v)
204
+ );
205
+ if (allPrimitive) {
206
+ return html`<ul class="roxy-chips">
207
+ ${value.map((v) => html`<li>${String(v)}</li>`)}
208
+ </ul>`;
209
+ }
210
+ }
211
+ return html`<roxy-data .data=${value}></roxy-data>`;
212
+ }
213
+ formatPrimitive(value) {
214
+ if (value === null || value === void 0) return "";
215
+ if (typeof value === "string") return value;
216
+ if (typeof value === "number" || typeof value === "boolean")
217
+ return String(value);
218
+ if (Array.isArray(value)) return value.map(String).join(", ");
219
+ return JSON.stringify(value);
220
+ }
221
+ collectKeys(rows) {
222
+ const seen = /* @__PURE__ */ new Set();
223
+ for (const row of rows) {
224
+ for (const k of Object.keys(row)) seen.add(k);
225
+ }
226
+ return Array.from(seen);
227
+ }
228
+ humanize(key) {
229
+ return key.replace(/[_-]+/g, " ").replace(/([a-z])([A-Z])/g, "$1 $2").replace(/^\w/, (c) => c.toUpperCase());
230
+ }
231
+ };
232
+ RoxyData.styles = [
233
+ baseStyles,
234
+ css2`
235
+ .roxy-card {
236
+ background: var(--roxy-bg, #fff);
237
+ border: 1px solid var(--roxy-border, #e4e4e7);
238
+ border-radius: var(--roxy-radius-md, 8px);
239
+ padding: var(--roxy-space-md, 1rem);
240
+ box-shadow: var(--roxy-shadow-sm);
241
+ }
242
+
243
+ .roxy-title {
244
+ font-size: var(--roxy-text-lg, 1.125rem);
245
+ font-weight: var(--roxy-weight-bold, 600);
246
+ margin: 0 0 var(--roxy-space-sm, 0.5rem) 0;
247
+ color: var(--roxy-primary, #0f172a);
248
+ letter-spacing: var(--roxy-tracking-tight);
249
+ }
250
+
251
+ .roxy-summary {
252
+ color: var(--roxy-secondary, #475569);
253
+ margin: 0 0 var(--roxy-space-md, 1rem) 0;
254
+ font-size: var(--roxy-text-sm, 0.875rem);
255
+ }
256
+
257
+ dl.roxy-rows {
258
+ margin: 0;
259
+ display: grid;
260
+ grid-template-columns: minmax(8ch, max-content) 1fr;
261
+ gap: var(--roxy-space-xs, 0.25rem) var(--roxy-space-md, 1rem);
262
+ }
263
+ dl.roxy-rows dt {
264
+ color: var(--roxy-muted, #71717a);
265
+ font-size: var(--roxy-text-sm, 0.875rem);
266
+ text-transform: capitalize;
267
+ }
268
+ dl.roxy-rows dd {
269
+ margin: 0;
270
+ color: var(--roxy-fg, #0a0a0a);
271
+ font-size: var(--roxy-text-sm, 0.875rem);
272
+ word-break: break-word;
273
+ }
274
+
275
+ ul.roxy-chips {
276
+ display: flex;
277
+ flex-wrap: wrap;
278
+ gap: var(--roxy-space-xs, 0.25rem);
279
+ padding: 0;
280
+ margin: 0;
281
+ list-style: none;
282
+ }
283
+ ul.roxy-chips li {
284
+ background: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);
285
+ color: var(--roxy-fg, #0a0a0a);
286
+ padding: 2px 8px;
287
+ border-radius: var(--roxy-radius-full, 9999px);
288
+ font-size: var(--roxy-text-xs, 0.75rem);
289
+ }
290
+
291
+ table.roxy-table {
292
+ width: 100%;
293
+ border-collapse: collapse;
294
+ font-size: var(--roxy-text-sm, 0.875rem);
295
+ }
296
+ table.roxy-table th,
297
+ table.roxy-table td {
298
+ border-bottom: 1px solid var(--roxy-border, #e4e4e7);
299
+ padding: var(--roxy-space-sm, 0.5rem);
300
+ text-align: left;
301
+ text-transform: none;
302
+ }
303
+ table.roxy-table th {
304
+ color: var(--roxy-muted, #71717a);
305
+ font-weight: var(--roxy-weight-bold, 600);
306
+ text-transform: capitalize;
307
+ font-size: var(--roxy-text-xs, 0.75rem);
308
+ letter-spacing: 0.04em;
309
+ }
310
+
311
+ .roxy-image {
312
+ max-width: 100%;
313
+ height: auto;
314
+ border-radius: var(--roxy-radius-md, 8px);
315
+ margin-bottom: var(--roxy-space-md, 1rem);
316
+ }
317
+
318
+ .roxy-section {
319
+ margin-bottom: var(--roxy-space-md, 1rem);
320
+ }
321
+ .roxy-section h4 {
322
+ font-size: var(--roxy-text-sm, 0.875rem);
323
+ font-weight: var(--roxy-weight-bold, 600);
324
+ color: var(--roxy-secondary, #475569);
325
+ margin: 0 0 var(--roxy-space-xs, 0.25rem) 0;
326
+ text-transform: capitalize;
327
+ }
328
+ `
329
+ ];
330
+ __decorateClass([
331
+ property({ attribute: false })
332
+ ], RoxyData.prototype, "data", 2);
333
+ RoxyData = __decorateClass([
334
+ customElement("roxy-data")
335
+ ], RoxyData);
336
+ export {
337
+ RoxyData
338
+ };
339
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/components/data.ts", "../../src/utils/base-styles.ts"],
4
+ "sourcesContent": ["import { css, html, LitElement, nothing, type TemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { baseStyles } from '../utils/base-styles.js';\n\n/**\n * Generic fallback renderer. Accepts ANY OpenAPI response shape and renders it\n * via field-name heuristics so future spec additions render reasonably without\n * hand-wired components. Mirrors the WordPress GenericRenderer pattern.\n *\n * Heuristic order:\n * 1. Primitive (string, number, boolean) -> single line.\n * 2. Array of primitives -> chip list.\n * 3. Array of objects with shared keys -> table.\n * 4. Object with title-like field -> card with key/value rows.\n * 5. Otherwise -> definition list of all keys.\n *\n * Future spec hint: when the server emits `x-roxy-ui` on a schema, the\n * dispatcher in tool-call (Phase 2.5) will select a hand-tuned component\n * instead of this fallback.\n */\n\ntype Json = string | number | boolean | null | Json[] | { [key: string]: Json };\n\nconst TITLE_KEYS = ['title', 'name', 'label', 'heading', 'overview', 'summary'];\nconst IMAGE_KEYS = ['imageUrl', 'image', 'icon', 'symbol'];\nconst SKIP_KEYS = ['imageUrl', 'image']; // rendered separately, not in body rows\n\n@customElement('roxy-data')\nexport class RoxyData extends LitElement {\n\tstatic styles = [\n\t\tbaseStyles,\n\t\tcss`\n\t\t\t.roxy-card {\n\t\t\t\tbackground: var(--roxy-bg, #fff);\n\t\t\t\tborder: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tpadding: var(--roxy-space-md, 1rem);\n\t\t\t\tbox-shadow: var(--roxy-shadow-sm);\n\t\t\t}\n\n\t\t\t.roxy-title {\n\t\t\t\tfont-size: var(--roxy-text-lg, 1.125rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tmargin: 0 0 var(--roxy-space-sm, 0.5rem) 0;\n\t\t\t\tcolor: var(--roxy-primary, #0f172a);\n\t\t\t\tletter-spacing: var(--roxy-tracking-tight);\n\t\t\t}\n\n\t\t\t.roxy-summary {\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t\tmargin: 0 0 var(--roxy-space-md, 1rem) 0;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\n\t\t\tdl.roxy-rows {\n\t\t\t\tmargin: 0;\n\t\t\t\tdisplay: grid;\n\t\t\t\tgrid-template-columns: minmax(8ch, max-content) 1fr;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem) var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\tdl.roxy-rows dt {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\ttext-transform: capitalize;\n\t\t\t}\n\t\t\tdl.roxy-rows dd {\n\t\t\t\tmargin: 0;\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tword-break: break-word;\n\t\t\t}\n\n\t\t\tul.roxy-chips {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-wrap: wrap;\n\t\t\t\tgap: var(--roxy-space-xs, 0.25rem);\n\t\t\t\tpadding: 0;\n\t\t\t\tmargin: 0;\n\t\t\t\tlist-style: none;\n\t\t\t}\n\t\t\tul.roxy-chips li {\n\t\t\t\tbackground: color-mix(in srgb, var(--roxy-accent, #f59e0b) 14%, transparent);\n\t\t\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\t\t\tpadding: 2px 8px;\n\t\t\t\tborder-radius: var(--roxy-radius-full, 9999px);\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t}\n\n\t\t\ttable.roxy-table {\n\t\t\t\twidth: 100%;\n\t\t\t\tborder-collapse: collapse;\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t}\n\t\t\ttable.roxy-table th,\n\t\t\ttable.roxy-table td {\n\t\t\t\tborder-bottom: 1px solid var(--roxy-border, #e4e4e7);\n\t\t\t\tpadding: var(--roxy-space-sm, 0.5rem);\n\t\t\t\ttext-align: left;\n\t\t\t\ttext-transform: none;\n\t\t\t}\n\t\t\ttable.roxy-table th {\n\t\t\t\tcolor: var(--roxy-muted, #71717a);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\ttext-transform: capitalize;\n\t\t\t\tfont-size: var(--roxy-text-xs, 0.75rem);\n\t\t\t\tletter-spacing: 0.04em;\n\t\t\t}\n\n\t\t\t.roxy-image {\n\t\t\t\tmax-width: 100%;\n\t\t\t\theight: auto;\n\t\t\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t\t\t\tmargin-bottom: var(--roxy-space-md, 1rem);\n\t\t\t}\n\n\t\t\t.roxy-section {\n\t\t\t\tmargin-bottom: var(--roxy-space-md, 1rem);\n\t\t\t}\n\t\t\t.roxy-section h4 {\n\t\t\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t\t\t\tfont-weight: var(--roxy-weight-bold, 600);\n\t\t\t\tcolor: var(--roxy-secondary, #475569);\n\t\t\t\tmargin: 0 0 var(--roxy-space-xs, 0.25rem) 0;\n\t\t\t\ttext-transform: capitalize;\n\t\t\t}\n\t\t`,\n\t];\n\n\t@property({ attribute: false })\n\tdata: Json = null;\n\n\trender() {\n\t\tif (this.data == null) {\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">No data</div>`;\n\t\t}\n\t\treturn html`<div\n\t\t\tclass=\"roxy-card\"\n\t\t\taria-label=\"Generic data display\"\n\t\t>\n\t\t\t${this.renderValue(this.data)}\n\t\t</div>`;\n\t}\n\n\tprivate renderValue(value: Json): TemplateResult | typeof nothing {\n\t\tif (value === null || value === undefined) return nothing;\n\t\tif (typeof value === 'string') return html`<p>${value}</p>`;\n\t\tif (typeof value === 'number' || typeof value === 'boolean') {\n\t\t\treturn html`<p>${String(value)}</p>`;\n\t\t}\n\t\tif (Array.isArray(value)) return this.renderArray(value);\n\t\treturn this.renderObject(value as Record<string, Json>);\n\t}\n\n\tprivate renderArray(arr: Json[]): TemplateResult {\n\t\tif (arr.length === 0) {\n\t\t\treturn html`<div class=\"roxy-empty\" role=\"status\">Empty list</div>`;\n\t\t}\n\t\tconst allPrimitive = arr.every(\n\t\t\t(v) => v === null || ['string', 'number', 'boolean'].includes(typeof v),\n\t\t);\n\t\tif (allPrimitive) {\n\t\t\treturn html`<ul class=\"roxy-chips\">\n\t\t\t\t${arr.map((v) => html`<li>${String(v)}</li>`)}\n\t\t\t</ul>`;\n\t\t}\n\t\tconst allObjects = arr.every(\n\t\t\t(v) => v !== null && typeof v === 'object' && !Array.isArray(v),\n\t\t);\n\t\tif (allObjects) return this.renderTable(arr as Record<string, Json>[]);\n\t\treturn html`<ol>\n\t\t\t${arr.map((v) => html`<li>${this.renderValue(v)}</li>`)}\n\t\t</ol>`;\n\t}\n\n\tprivate renderTable(rows: Record<string, Json>[]): TemplateResult {\n\t\tconst keys = this.collectKeys(rows);\n\t\treturn html`<table class=\"roxy-table\" role=\"table\">\n\t\t\t<thead>\n\t\t\t\t<tr>\n\t\t\t\t\t${keys.map((k) => html`<th>${this.humanize(k)}</th>`)}\n\t\t\t\t</tr>\n\t\t\t</thead>\n\t\t\t<tbody>\n\t\t\t\t${rows.map(\n\t\t\t\t\t(row) => html`<tr>\n\t\t\t\t\t\t${keys.map((k) => html`<td>${this.formatPrimitive(row[k])}</td>`)}\n\t\t\t\t\t</tr>`,\n\t\t\t\t)}\n\t\t\t</tbody>\n\t\t</table>`;\n\t}\n\n\tprivate renderObject(obj: Record<string, Json>): TemplateResult {\n\t\tconst titleKey = TITLE_KEYS.find((k) => typeof obj[k] === 'string');\n\t\tconst imageKey = IMAGE_KEYS.find(\n\t\t\t(k) =>\n\t\t\t\ttypeof obj[k] === 'string' && (obj[k] as string).startsWith('http'),\n\t\t);\n\t\tconst summaryKey =\n\t\t\ttitleKey !== 'summary' && typeof obj.summary === 'string'\n\t\t\t\t? 'summary'\n\t\t\t\t: null;\n\t\tconst rows = Object.entries(obj).filter(\n\t\t\t([k, v]) =>\n\t\t\t\tk !== titleKey &&\n\t\t\t\tk !== summaryKey &&\n\t\t\t\t!SKIP_KEYS.includes(k) &&\n\t\t\t\tv !== null &&\n\t\t\t\tv !== undefined,\n\t\t);\n\n\t\treturn html`\n\t\t\t${\n\t\t\t\timageKey\n\t\t\t\t\t? html`<img\n\t\t\t\t\t\tclass=\"roxy-image\"\n\t\t\t\t\t\tsrc=${String(obj[imageKey])}\n\t\t\t\t\t\talt=${titleKey ? String(obj[titleKey]) : 'illustration'}\n\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t/>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t\t${titleKey ? html`<h3 class=\"roxy-title\">${obj[titleKey]}</h3>` : nothing}\n\t\t\t${summaryKey ? html`<p class=\"roxy-summary\">${obj[summaryKey]}</p>` : nothing}\n\t\t\t${\n\t\t\t\trows.length > 0\n\t\t\t\t\t? html`<dl class=\"roxy-rows\">\n\t\t\t\t\t\t${rows.map(\n\t\t\t\t\t\t\t([k, v]) => html`\n\t\t\t\t\t\t\t\t<dt>${this.humanize(k)}</dt>\n\t\t\t\t\t\t\t\t<dd>${this.renderField(v)}</dd>\n\t\t\t\t\t\t\t`,\n\t\t\t\t\t\t)}\n\t\t\t\t\t</dl>`\n\t\t\t\t\t: nothing\n\t\t\t}\n\t\t`;\n\t}\n\n\tprivate renderField(value: Json): TemplateResult | string {\n\t\tif (value === null || value === undefined) return '';\n\t\tif (typeof value === 'string') return value;\n\t\tif (typeof value === 'number' || typeof value === 'boolean')\n\t\t\treturn String(value);\n\t\tif (Array.isArray(value)) {\n\t\t\tconst allPrimitive = value.every((v) =>\n\t\t\t\t['string', 'number', 'boolean'].includes(typeof v),\n\t\t\t);\n\t\t\tif (allPrimitive) {\n\t\t\t\treturn html`<ul class=\"roxy-chips\">\n\t\t\t\t\t${value.map((v) => html`<li>${String(v)}</li>`)}\n\t\t\t\t</ul>`;\n\t\t\t}\n\t\t}\n\t\treturn html`<roxy-data .data=${value}></roxy-data>`;\n\t}\n\n\tprivate formatPrimitive(value: Json | undefined): string {\n\t\tif (value === null || value === undefined) return '';\n\t\tif (typeof value === 'string') return value;\n\t\tif (typeof value === 'number' || typeof value === 'boolean')\n\t\t\treturn String(value);\n\t\tif (Array.isArray(value)) return value.map(String).join(', ');\n\t\treturn JSON.stringify(value);\n\t}\n\n\tprivate collectKeys(rows: Record<string, Json>[]): string[] {\n\t\tconst seen = new Set<string>();\n\t\tfor (const row of rows) {\n\t\t\tfor (const k of Object.keys(row)) seen.add(k);\n\t\t}\n\t\treturn Array.from(seen);\n\t}\n\n\tprivate humanize(key: string): string {\n\t\treturn key\n\t\t\t.replace(/[_-]+/g, ' ')\n\t\t\t.replace(/([a-z])([A-Z])/g, '$1 $2')\n\t\t\t.replace(/^\\w/, (c) => c.toUpperCase());\n\t}\n}\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t'roxy-data': RoxyData;\n\t}\n}\n", "import { css } from 'lit';\n\n/**\n * Shared host styles every component pulls in. Sets default font, color,\n * container query support, and the entry fade-in.\n */\nexport const baseStyles = css`\n\t:host {\n\t\tdisplay: block;\n\t\tcontainer-type: inline-size;\n\t\tfont-family: var(\n\t\t\t--roxy-font-sans,\n\t\t\tsystem-ui,\n\t\t\t-apple-system,\n\t\t\tBlinkMacSystemFont,\n\t\t\t'Segoe UI',\n\t\t\tRoboto,\n\t\t\tsans-serif\n\t\t);\n\t\tcolor: var(--roxy-fg, #0a0a0a);\n\t\tbackground: transparent;\n\t\tfont-size: var(--roxy-text-base, 1rem);\n\t\tline-height: var(--roxy-leading-normal, 1.5);\n\t\tanimation: roxy-fade-in var(--roxy-motion-duration, 200ms)\n\t\t\tvar(--roxy-motion-easing, cubic-bezier(0.4, 0, 0.2, 1)) both;\n\t}\n\n\t*,\n\t*::before,\n\t*::after {\n\t\tbox-sizing: border-box;\n\t}\n\n\t@keyframes roxy-fade-in {\n\t\tfrom {\n\t\t\topacity: 0;\n\t\t\ttransform: translateY(2px);\n\t\t}\n\t\tto {\n\t\t\topacity: 1;\n\t\t\ttransform: translateY(0);\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t:host {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-skeleton {\n\t\tbackground: linear-gradient(\n\t\t\t90deg,\n\t\t\tvar(--roxy-border, #e4e4e7) 0%,\n\t\t\tcolor-mix(in srgb, var(--roxy-border, #e4e4e7) 60%, transparent) 50%,\n\t\t\tvar(--roxy-border, #e4e4e7) 100%\n\t\t);\n\t\tbackground-size: 200% 100%;\n\t\tanimation: roxy-shimmer 1.4s ease-in-out infinite;\n\t\tborder-radius: var(--roxy-radius-md, 8px);\n\t}\n\n\t@keyframes roxy-shimmer {\n\t\t0% {\n\t\t\tbackground-position: 200% 0;\n\t\t}\n\t\t100% {\n\t\t\tbackground-position: -200% 0;\n\t\t}\n\t}\n\n\t@media (prefers-reduced-motion: reduce) {\n\t\t.roxy-skeleton {\n\t\t\tanimation: none;\n\t\t}\n\t}\n\n\t.roxy-empty {\n\t\tpadding: var(--roxy-space-lg, 1.5rem);\n\t\tcolor: var(--roxy-muted, #71717a);\n\t\ttext-align: center;\n\t\tfont-size: var(--roxy-text-sm, 0.875rem);\n\t}\n\n\t:host(:focus-within) .roxy-card {\n\t\toutline: 2px solid var(--roxy-ring, rgba(245, 158, 11, 0.4));\n\t\toutline-offset: 2px;\n\t}\n`;\n"],
5
+ "mappings": "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",
6
+ "names": ["css", "css"]
7
+ }
@@ -0,0 +1,35 @@
1
+ import { LitElement } from 'lit';
2
+ interface DoshaData {
3
+ present?: boolean;
4
+ severity?: 'Mild' | 'Moderate' | 'Severe' | string;
5
+ type?: string;
6
+ description?: string;
7
+ remedies?: string[];
8
+ exceptions?: string[];
9
+ effects?: string | {
10
+ marriage?: string;
11
+ personality?: string;
12
+ timing?: string;
13
+ relationships?: string;
14
+ general?: string;
15
+ phases?: Record<string, string>;
16
+ };
17
+ }
18
+ /**
19
+ * Dosha presence card. Renders /vedic-astrology/dosha/{manglik,kalsarpa,sadhesati}.
20
+ * Visual severity indicator + remedies + scoped effects.
21
+ */
22
+ export declare class RoxyDoshaCard extends LitElement {
23
+ static styles: import("lit").CSSResult[];
24
+ data: DoshaData | null;
25
+ type: 'manglik' | 'kalsarpa' | 'sadhesati' | string;
26
+ render(): import("lit").TemplateResult<1>;
27
+ private renderEffects;
28
+ }
29
+ declare global {
30
+ interface HTMLElementTagNameMap {
31
+ 'roxy-dosha-card': RoxyDoshaCard;
32
+ }
33
+ }
34
+ export {};
35
+ //# sourceMappingURL=dosha-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dosha-card.d.ts","sourceRoot":"","sources":["../../src/components/dosha-card.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAW,MAAM,KAAK,CAAC;AAIrD,UAAU,SAAS;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EACL,MAAM,GACN;QACA,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAC/B,CAAC;CACL;AAQD;;;GAGG;AACH,qBACa,aAAc,SAAQ,UAAU;IAC5C,MAAM,CAAC,MAAM,4BA4FX;IAGF,IAAI,EAAE,SAAS,GAAG,IAAI,CAAQ;IAG9B,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAa;IAEhE,MAAM;IAyDN,OAAO,CAAC,aAAa;CAgBrB;AAED,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,iBAAiB,EAAE,aAAa,CAAC;KACjC;CACD"}