@flamingo-stack/openframe-frontend-core 0.0.723 → 0.0.725

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 (118) hide show
  1. package/dist/{chunk-2VOPQJNR.js → chunk-2MMZTACD.js} +2 -2
  2. package/dist/{chunk-OHC2MPUO.cjs → chunk-2SO3OJFY.cjs} +35 -35
  3. package/dist/{chunk-YQOJOW2Z.cjs → chunk-2VOZ37BL.cjs} +64 -64
  4. package/dist/{chunk-WSMOTZRJ.cjs → chunk-4ZZ4TNCY.cjs} +11 -11
  5. package/dist/{chunk-YUSA7IPD.js → chunk-5FVWDDX6.js} +3 -3
  6. package/dist/{chunk-PKS2QQJU.js → chunk-6EFNWQRY.js} +2 -1
  7. package/dist/{chunk-NESUUHPV.cjs → chunk-772242QR.cjs} +76 -76
  8. package/dist/{chunk-3RIKO2O2.cjs → chunk-7V5KFBY2.cjs} +31 -31
  9. package/dist/{chunk-MWLVYYRX.cjs → chunk-AI3CLDZO.cjs} +2580 -2120
  10. package/dist/{chunk-YGIUWQEN.js → chunk-ASHRHL4W.js} +7 -7
  11. package/dist/{chunk-A7JPMNHF.js → chunk-ASIXPRHV.js} +6 -6
  12. package/dist/{chunk-7JXCLUU7.js → chunk-AX4F35C2.js} +2 -2
  13. package/dist/{chunk-TDSLKKX7.cjs → chunk-B7234BE2.cjs} +16 -16
  14. package/dist/{chunk-SBCJFJ6Q.js → chunk-F56GNKX2.js} +4 -4
  15. package/dist/{chunk-VIFVSFYY.js → chunk-F77J34W2.js} +1 -1
  16. package/dist/{chunk-JENNI7XU.cjs → chunk-HEQ4GPYE.cjs} +5 -4
  17. package/dist/{chunk-LV6UJD2K.cjs → chunk-IITB5TJR.cjs} +10 -2
  18. package/dist/{chunk-WVA7SCLY.js → chunk-IOTAUWWF.js} +1 -1
  19. package/dist/{chunk-OVG6MV3X.js → chunk-JAKG6BY7.js} +6 -6
  20. package/dist/{chunk-F6JAGSKV.js → chunk-JVHP7Y4S.js} +5 -5
  21. package/dist/{chunk-WY4SLTMZ.js → chunk-JXJFUGJY.js} +1 -1
  22. package/dist/{chunk-GYUFKNOQ.cjs → chunk-KLCOSY7B.cjs} +4 -4
  23. package/dist/{chunk-P7MDECYI.cjs → chunk-KNLRL63O.cjs} +41 -41
  24. package/dist/{chunk-VGXAZEQP.cjs → chunk-LR6DJY4Z.cjs} +17 -17
  25. package/dist/{chunk-KSADTFNZ.cjs → chunk-LYQYLPPV.cjs} +32 -32
  26. package/dist/{chunk-QBXEF7D5.js → chunk-MGTZ2BKY.js} +4 -4
  27. package/dist/{chunk-IIBTYCEN.js → chunk-MLFS5G3V.js} +89 -14
  28. package/dist/{chunk-GRDJR2Q7.js → chunk-MSPXMSMY.js} +1 -1
  29. package/dist/{chunk-FDWYBJYD.cjs → chunk-NJV3LIDE.cjs} +3 -3
  30. package/dist/{chunk-JL7AHSFE.js → chunk-OBMWSUBK.js} +6 -6
  31. package/dist/{chunk-N4VCU6XP.js → chunk-PUADVXJD.js} +1 -1
  32. package/dist/{chunk-KY4WQYYG.cjs → chunk-QV4GO3GW.cjs} +19 -19
  33. package/dist/{chunk-OWRD2GZU.cjs → chunk-RU6BTELI.cjs} +687 -612
  34. package/dist/{chunk-Y5H3M7OM.cjs → chunk-SE4O4HCD.cjs} +23 -23
  35. package/dist/{chunk-2MC4DRSC.cjs → chunk-SEVKFMKR.cjs} +3 -3
  36. package/dist/{chunk-UYMTAFHG.js → chunk-TU5LEF6A.js} +1 -1
  37. package/dist/{chunk-NFABAOMD.cjs → chunk-U6LRRG2E.cjs} +15 -15
  38. package/dist/{chunk-G6YNPBWV.js → chunk-W2DXHR2R.js} +3045 -2585
  39. package/dist/{chunk-KSZRALRL.cjs → chunk-YPEILGVZ.cjs} +3 -3
  40. package/dist/{chunk-EWED6ISQ.js → chunk-YQDKVGKO.js} +9 -1
  41. package/dist/{chunk-6QTGLBJH.cjs → chunk-ZSXZE4FJ.cjs} +3 -3
  42. package/dist/{chunk-XTG7W75B.js → chunk-ZZRUKEN2.js} +4 -4
  43. package/dist/{cloud-tenants-3TVX7U23.cjs → cloud-tenants-SMULXU54.cjs} +7 -7
  44. package/dist/{cloud-tenants-N6KV2T7X.js → cloud-tenants-US63E2HV.js} +6 -6
  45. package/dist/components/case-studies/index.cjs +20 -20
  46. package/dist/components/case-studies/index.js +7 -7
  47. package/dist/components/chat/entity-cards/dispatch.d.ts.map +1 -1
  48. package/dist/components/chat/index.cjs +5 -5
  49. package/dist/components/chat/index.js +4 -4
  50. package/dist/components/chat/utils/icon-library.d.ts +2 -0
  51. package/dist/components/chat/utils/icon-library.d.ts.map +1 -1
  52. package/dist/components/contact/index.cjs +8 -8
  53. package/dist/components/contact/index.js +7 -7
  54. package/dist/components/docs/index.cjs +11 -11
  55. package/dist/components/docs/index.js +10 -10
  56. package/dist/components/embeds/index.cjs +8 -8
  57. package/dist/components/embeds/index.js +7 -7
  58. package/dist/components/faq/index.cjs +8 -8
  59. package/dist/components/faq/index.js +7 -7
  60. package/dist/components/features/index.cjs +23 -7
  61. package/dist/components/features/index.d.ts +1 -0
  62. package/dist/components/features/index.d.ts.map +1 -1
  63. package/dist/components/features/index.js +22 -6
  64. package/dist/components/features/model-token-rates.d.ts +179 -0
  65. package/dist/components/features/model-token-rates.d.ts.map +1 -0
  66. package/dist/components/help-center-pages/index.cjs +106 -106
  67. package/dist/components/help-center-pages/index.js +18 -18
  68. package/dist/components/index.cjs +71 -55
  69. package/dist/components/index.js +34 -18
  70. package/dist/components/meeting-scheduler/index.cjs +32 -32
  71. package/dist/components/meeting-scheduler/index.js +6 -6
  72. package/dist/components/navigation/index.cjs +10 -10
  73. package/dist/components/navigation/index.js +9 -9
  74. package/dist/components/onboarding-guides/index.cjs +10 -10
  75. package/dist/components/onboarding-guides/index.js +9 -9
  76. package/dist/components/product-demo/index.cjs +7 -7
  77. package/dist/components/product-demo/index.js +7 -7
  78. package/dist/components/related-content/index.cjs +4 -4
  79. package/dist/components/related-content/index.js +3 -3
  80. package/dist/components/tickets/index.cjs +11 -11
  81. package/dist/components/tickets/index.js +10 -10
  82. package/dist/components/ui/index.cjs +7 -7
  83. package/dist/components/ui/index.js +6 -6
  84. package/dist/{devices-MAALZ7DX.cjs → devices-6ZURNFRB.cjs} +8 -8
  85. package/dist/{devices-275UZZUS.js → devices-JWHGWKLK.js} +6 -6
  86. package/dist/index.cjs +45 -11
  87. package/dist/index.js +44 -10
  88. package/dist/{knowledge-YMMULPPK.cjs → knowledge-CY66JZ54.cjs} +8 -8
  89. package/dist/{knowledge-THXC2KC3.js → knowledge-TEDPLCFX.js} +6 -6
  90. package/dist/{logs-IBUKQOHS.cjs → logs-MO357RE7.cjs} +15 -15
  91. package/dist/{logs-GM2XBHYT.js → logs-S46THPPD.js} +6 -6
  92. package/dist/{policies-NKMRK6RR.js → policies-BUXT7DKF.js} +6 -6
  93. package/dist/{policies-J5GJXD6G.cjs → policies-GSH4K5YP.cjs} +11 -11
  94. package/dist/{remote-session-Z2YCUPHU.cjs → remote-session-CSX6ESSG.cjs} +5 -5
  95. package/dist/{remote-session-WCLR47RN.js → remote-session-ZBCWD5A5.js} +3 -3
  96. package/dist/{software-update-JHC4T4SE.cjs → software-update-2ETT35NM.cjs} +11 -11
  97. package/dist/{software-update-EKKMKDWI.js → software-update-YKS6KLX2.js} +6 -6
  98. package/dist/utils/ai-providers.d.ts +29 -0
  99. package/dist/utils/ai-providers.d.ts.map +1 -0
  100. package/dist/utils/index.cjs +76 -2
  101. package/dist/utils/index.d.ts +2 -0
  102. package/dist/utils/index.d.ts.map +1 -1
  103. package/dist/utils/index.js +68 -3
  104. package/dist/utils/list-url.d.ts.map +1 -1
  105. package/dist/utils/model-token-rates.d.ts +55 -0
  106. package/dist/utils/model-token-rates.d.ts.map +1 -0
  107. package/dist/utils/source-icons.d.ts.map +1 -1
  108. package/package.json +1 -1
  109. package/src/components/chat/entity-cards/dispatch.tsx +3 -0
  110. package/src/components/chat/utils/icon-library.tsx +14 -3
  111. package/src/components/chat/utils/source-row-cta.ts +3 -3
  112. package/src/components/features/index.ts +1 -0
  113. package/src/components/features/model-token-rates.tsx +696 -0
  114. package/src/utils/ai-providers.ts +46 -0
  115. package/src/utils/index.ts +2 -0
  116. package/src/utils/list-url.ts +1 -0
  117. package/src/utils/model-token-rates.ts +103 -0
  118. package/src/utils/source-icons.ts +3 -0
@@ -0,0 +1,179 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type ModelTokenRate, type TokenPrice } from '../../utils/model-token-rates';
3
+ /**
4
+ * The per-model AI token exchange rates, in the two places they are shown:
5
+ *
6
+ * - `ModelTokenRates` (+ `ModelTokenRatesPopover`): a small table behind a
7
+ * question mark, for the product's cards that count in tokens.
8
+ * - `ModelTokenExchange`: the whole idea as three steps with a figure each
9
+ * (buy OpenFrame tokens, use a frontier model, its tokens are charged at an
10
+ * exchange rate). For a page (the website's pricing page).
11
+ *
12
+ * Both state a rate with the same functions (`utils/model-token-rates`,
13
+ * server-safe), so a rate reads the same wherever it is stated. Neither
14
+ * fetches: a host reads the rates its own way and hands them in, with `status`
15
+ * saying where that read stands. Each holds ONE size loading, loaded, failed or
16
+ * empty.
17
+ *
18
+ * A rate is the number of OpenFrame tokens ONE token of the model charges to
19
+ * the balance.
20
+ */
21
+ /** Where the host's read of the rates stands. */
22
+ export type ModelTokenRatesStatus = 'loading' | 'error' | 'ready';
23
+ /** The wording of both views, stated once. */
24
+ export declare const MODEL_TOKEN_RATES_COPY: {
25
+ readonly trigger: "Per-model token rates";
26
+ readonly unit: "OpenFrame tokens used per model token";
27
+ readonly model: "Model";
28
+ readonly input: "Input";
29
+ readonly output: "Output";
30
+ /** The exchange: three steps, each with its own figure. */
31
+ readonly exchange: {
32
+ readonly buy: {
33
+ readonly title: "You buy OpenFrame tokens";
34
+ /** Under the price: "buys 1M OpenFrame tokens" */
35
+ readonly words: (tokens: string) => string;
36
+ /** Under the tokens, where no price is known. */
37
+ readonly unit: "OpenFrame tokens";
38
+ /** The amount, where no price is known: "1M OpenFrame tokens" */
39
+ readonly tokens: (tokens: string) => string;
40
+ /** The slider's label. */
41
+ readonly amount: "How many tokens";
42
+ /** Over the one-tap amounts. */
43
+ readonly presets: "Included in your plan";
44
+ /** A one-tap amount: "10M every month" */
45
+ readonly preset: (tokens: string, label: string) => string;
46
+ };
47
+ readonly use: {
48
+ readonly title: "You use a frontier AI model";
49
+ readonly model: "Model";
50
+ readonly search: "Search models";
51
+ readonly noMatch: "No model matches";
52
+ };
53
+ readonly charge: {
54
+ readonly title: "Its tokens are charged at an exchange rate";
55
+ /** Over the two rates: the unit, said once. */
56
+ readonly unit: "OpenFrame tokens charged";
57
+ readonly input: "per token read";
58
+ readonly output: "per token written";
59
+ /** Over the answer: "So $10.00 on Claude Opus 5.5 buys" */
60
+ readonly so: (balance: string, model: string) => string;
61
+ /** Beside the answer's number: "750K tokens read" */
62
+ readonly read: "tokens read";
63
+ /** Under it: "or 150K tokens written" */
64
+ readonly orWritten: (output: string) => string;
65
+ };
66
+ };
67
+ readonly autoTopUp: {
68
+ readonly on: "Auto Top Up Enabled";
69
+ readonly off: "Auto Top Up Disabled";
70
+ };
71
+ readonly unavailable: {
72
+ readonly title: "Rates unavailable";
73
+ readonly body: "We couldn't load the per-model token rates. They're a reference only: your plan and its price are unaffected.";
74
+ };
75
+ readonly empty: "No token rates are in effect right now.";
76
+ };
77
+ export interface ModelTokenRatesProps {
78
+ /** The rates, once read. */
79
+ rates?: readonly ModelTokenRate[];
80
+ /** Where the read stands. Default `ready`. */
81
+ status?: ModelTokenRatesStatus;
82
+ /**
83
+ * Whether the balance these rates draw on refills itself: the panel's first
84
+ * line on a billing page. Left out where there is no balance to have that state.
85
+ */
86
+ autoTopUpEnabled?: boolean;
87
+ className?: string;
88
+ }
89
+ /**
90
+ * The table in its frame, at ONE height in every state. The frame and the auto
91
+ * top-up line stay put while the rates load or fail to: that line is a fact
92
+ * about the subscription, not about the rates.
93
+ */
94
+ export declare function ModelTokenRates({ rates, status, autoTopUpEnabled, className }: ModelTokenRatesProps): import("react").JSX.Element;
95
+ /**
96
+ * The question-mark button that opens the rates, for every card that counts in
97
+ * tokens. One trigger, so two cards cannot open two different panels. The panel
98
+ * is rendered only while open, so a host that reads the rates lazily (`children`)
99
+ * reads them on open.
100
+ */
101
+ export declare function ModelTokenRatesPopover({ children, triggerClassName, ...panel }: ModelTokenRatesProps & {
102
+ /** The panel, when the host renders it itself (a lazy read behind its own boundaries). Default: `ModelTokenRates` with these props. */
103
+ children?: ReactNode;
104
+ triggerClassName?: string;
105
+ }): import("react").JSX.Element;
106
+ /** Why the rates are missing, in the box the rates would fill. Shown on a deliberate click or in a page's reserved space, so it never renders empty. */
107
+ export declare function ModelTokenRatesUnavailable({ className }: {
108
+ className?: string;
109
+ }): import("react").JSX.Element;
110
+ /** The table's loading footprint: the provider tabs, the header and rows of the boxes the loaded rows use. */
111
+ export declare function ModelTokenRatesSkeleton(): import("react").JSX.Element;
112
+ export interface ModelTokenExchangeProps {
113
+ /** The model whose rate is shown: the one picked, once the host has read it. */
114
+ rate?: ModelTokenRate | null;
115
+ /** Where the host's read of that model stands. Default `ready`. */
116
+ status?: ModelTokenRatesStatus;
117
+ /** The providers to choose between (their keys), in the host's order. */
118
+ providers?: readonly string[];
119
+ /** The provider chosen, and the host's handler for a change (it searches that provider's models). */
120
+ provider?: string | null;
121
+ onProviderChange?: (providerType: string) => void;
122
+ /**
123
+ * The picker's options: what the HOST's search answered for `query` within
124
+ * `provider`. The picker never filters them itself: searching is the host's
125
+ * server's job.
126
+ */
127
+ models?: readonly ModelTokenRate[];
128
+ /** What is typed in the picker, and the host's handler for it (it searches). */
129
+ query?: string;
130
+ onQueryChange?: (query: string) => void;
131
+ /** The host's search is in flight. */
132
+ searching?: boolean;
133
+ /** A model was picked: its `modelName`. */
134
+ onPick?: (modelName: string) => void;
135
+ /** What OpenFrame tokens cost. Given: step 1 states the price of the amount chosen. Not given: the tokens alone. */
136
+ tokenPrice?: TokenPrice | null;
137
+ /** The amount step 1 opens on, in OpenFrame tokens. Default: the amount `tokenPrice` is quoted for, else one million. */
138
+ defaultAmount?: number;
139
+ /** The slider's bounds and step, in OpenFrame tokens. Default one to fifty million, a million at a time. */
140
+ amountRange?: {
141
+ min: number;
142
+ max: number;
143
+ step: number;
144
+ };
145
+ /** Amounts offered as one-tap choices under the slider (what a plan includes): the tokens and what to call them. */
146
+ presets?: readonly {
147
+ tokens: number;
148
+ label: string;
149
+ }[];
150
+ className?: string;
151
+ }
152
+ /** The amount step 1 opens on when the host names none, and the slider's default bounds. */
153
+ export declare const MODEL_TOKEN_EXCHANGE_BALANCE = 1000000;
154
+ export declare const MODEL_TOKEN_EXCHANGE_RANGE: {
155
+ readonly min: 1000000;
156
+ readonly max: 50000000;
157
+ readonly step: 1000000;
158
+ };
159
+ /**
160
+ * How AI tokens are paid for, as three steps read left to right, each with its
161
+ * own figure, so the whole idea is on screen at once:
162
+ *
163
+ * 1. You buy OpenFrame tokens "$10.00 buys 1M OpenFrame tokens"
164
+ * 2. You use a frontier AI model provider buttons, then the model
165
+ * 3. Its tokens are charged at an exchange rate
166
+ * "1.33× per token it reads, 6.67× per token it
167
+ * writes", then what the step 1 balance buys
168
+ *
169
+ * Step 2 is where the visitor acts: the lib's `PushButtonSelector` picks the
170
+ * provider and the lib's `Autocomplete` (the provider's mark on every option)
171
+ * finds a model of it. The picker SEARCHES ON THE SERVER: the host hands in
172
+ * `models` (what its search answered for `query` within `provider`) and the
173
+ * picker shows exactly those, never a filter of its own.
174
+ *
175
+ * One size in every state: each figure and its words are the same boxes loading
176
+ * (bars of their own line height), loaded, failed and empty.
177
+ */
178
+ export declare function ModelTokenExchange({ rate, status, providers, provider, onProviderChange, models, query, onQueryChange, searching, onPick, tokenPrice, defaultAmount, amountRange, presets, className, }: ModelTokenExchangeProps): import("react").JSX.Element;
179
+ //# sourceMappingURL=model-token-rates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-token-rates.d.ts","sourceRoot":"","sources":["../../../src/components/features/model-token-rates.tsx"],"names":[],"mappings":"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"}