df-script 1.5.0 → 1.7.0
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.
- package/README.md +125 -9
- package/dist/api.d.ts +3 -2
- package/dist/assets/index-DBhGK6Tp.css +1 -0
- package/dist/assets/index-DEJEV_tU.js +195 -0
- package/dist/columnExpressions/ColumnExpr.d.ts +14 -7
- package/dist/columnExpressions/ExprBase.d.ts +26 -12
- package/dist/columnExpressions/constants.d.ts +1 -0
- package/dist/columnExpressions/functions/all.d.ts +23 -0
- package/dist/columnExpressions/functions/coalesce.d.ts +31 -2
- package/dist/columnExpressions/functions/element.d.ts +26 -1
- package/dist/columnExpressions/functions/exclude.d.ts +24 -0
- package/dist/columnExpressions/functions/implode.d.ts +28 -0
- package/dist/columnExpressions/functions/lit.d.ts +27 -0
- package/dist/columnExpressions/functions/seq_range.d.ts +36 -0
- package/dist/columnExpressions/functions/struct.d.ts +31 -0
- package/dist/columnExpressions/functions/when.d.ts +38 -8
- package/dist/columnExpressions/index.d.ts +2 -1
- package/dist/columnExpressions/mixins/AggregationExpr.d.ts +336 -2
- package/dist/columnExpressions/mixins/ArithmeticExpr.d.ts +620 -10
- package/dist/columnExpressions/mixins/ArrayExpr.d.ts +567 -0
- package/dist/columnExpressions/mixins/ComparisonExpr.d.ts +353 -0
- package/dist/columnExpressions/mixins/LogicalExpr.d.ts +82 -0
- package/dist/columnExpressions/mixins/ManipulationExpr.d.ts +40 -0
- package/dist/columnExpressions/mixins/StringExpr.d.ts +658 -5
- package/dist/columnExpressions/mixins/StructExpr.d.ts +70 -0
- package/dist/columnExpressions/mixins/TemporalExpr.d.ts +530 -4
- package/dist/columnExpressions/mixins/WindowExpr.d.ts +313 -2
- package/dist/columnExpressions/types.d.ts +2 -0
- package/dist/constants.d.ts +11 -0
- package/dist/dataframe/dataframe.d.ts +933 -3
- package/dist/dataframe/grouped/grouped.d.ts +41 -6
- package/dist/dataframe/types.d.ts +1 -0
- package/dist/dataframe/utils.d.ts +1 -0
- package/dist/datatypes/index.d.ts +3 -2
- package/dist/datatypes/types.d.ts +52 -7
- package/dist/exceptions/index.d.ts +23 -0
- package/dist/functions/concat.d.ts +50 -0
- package/dist/functions/read_csv.d.ts +9 -0
- package/dist/functions/read_json.d.ts +7 -2
- package/dist/index.html +17 -0
- package/dist/index.js +6 -6
- package/dist/index.mjs +6 -0
- package/dist/types.d.ts +51 -16
- package/dist/utils/{list.d.ts → array.d.ts} +68 -15
- package/dist/utils/binary.d.ts +3 -0
- package/dist/utils/csv.d.ts +1 -0
- package/dist/utils/date.d.ts +23 -54
- package/dist/utils/index.d.ts +3 -2
- package/dist/utils/json.d.ts +1 -0
- package/dist/utils/number.d.ts +15 -29
- package/dist/utils/object.d.ts +27 -0
- package/dist/utils/string.d.ts +15 -5
- package/package.json +18 -4
- package/dist/api.js +0 -26
- package/dist/bundle.min.js +0 -1
- package/dist/columnExpressions/ColumnExpr.js +0 -219
- package/dist/columnExpressions/ExprBase.js +0 -92
- package/dist/columnExpressions/constants.js +0 -7
- package/dist/columnExpressions/functions/all.js +0 -11
- package/dist/columnExpressions/functions/coalesce.js +0 -44
- package/dist/columnExpressions/functions/element.js +0 -11
- package/dist/columnExpressions/functions/exclude.js +0 -13
- package/dist/columnExpressions/functions/implode.js +0 -7
- package/dist/columnExpressions/functions/lit.js +0 -17
- package/dist/columnExpressions/functions/repeat.d.ts +0 -47
- package/dist/columnExpressions/functions/repeat.js +0 -131
- package/dist/columnExpressions/functions/seq_range.js +0 -91
- package/dist/columnExpressions/functions/when.js +0 -85
- package/dist/columnExpressions/index.js +0 -38
- package/dist/columnExpressions/mixins/AggregationExpr.js +0 -76
- package/dist/columnExpressions/mixins/ArithmeticExpr.js +0 -131
- package/dist/columnExpressions/mixins/BooleanExpr.d.ts +0 -40
- package/dist/columnExpressions/mixins/BooleanExpr.js +0 -67
- package/dist/columnExpressions/mixins/ComparisonExpr.js +0 -250
- package/dist/columnExpressions/mixins/ListExpr.d.ts +0 -39
- package/dist/columnExpressions/mixins/ListExpr.js +0 -224
- package/dist/columnExpressions/mixins/LogicalExpr.js +0 -53
- package/dist/columnExpressions/mixins/ManipulationExpr.js +0 -71
- package/dist/columnExpressions/mixins/NumericExpr.d.ts +0 -92
- package/dist/columnExpressions/mixins/NumericExpr.js +0 -259
- package/dist/columnExpressions/mixins/StringExpr.js +0 -237
- package/dist/columnExpressions/mixins/StructExpr.js +0 -139
- package/dist/columnExpressions/mixins/TemporalExpr.js +0 -126
- package/dist/columnExpressions/mixins/WindowExpr.js +0 -151
- package/dist/columnExpressions/types.js +0 -2
- package/dist/columnExpressions/utils.js +0 -45
- package/dist/dataframe/constants.js +0 -7
- package/dist/dataframe/dataframe.js +0 -990
- package/dist/dataframe/grouped/grouped.js +0 -114
- package/dist/dataframe/index.js +0 -20
- package/dist/dataframe/types.js +0 -2
- package/dist/dataframe/utils.js +0 -307
- package/dist/datatypes/DataType.js +0 -76
- package/dist/datatypes/index.js +0 -46
- package/dist/datatypes/types/Binary.d.ts +0 -9
- package/dist/datatypes/types/Binary.js +0 -18
- package/dist/datatypes/types/Boolean.d.ts +0 -9
- package/dist/datatypes/types/Boolean.js +0 -19
- package/dist/datatypes/types/Date.d.ts +0 -8
- package/dist/datatypes/types/Date.js +0 -21
- package/dist/datatypes/types/Datetime.d.ts +0 -8
- package/dist/datatypes/types/Datetime.js +0 -17
- package/dist/datatypes/types/Decimal.d.ts +0 -10
- package/dist/datatypes/types/Decimal.js +0 -28
- package/dist/datatypes/types/Duration.d.ts +0 -8
- package/dist/datatypes/types/Duration.js +0 -17
- package/dist/datatypes/types/Float32.d.ts +0 -8
- package/dist/datatypes/types/Float32.js +0 -17
- package/dist/datatypes/types/Float64.d.ts +0 -8
- package/dist/datatypes/types/Float64.js +0 -17
- package/dist/datatypes/types/Int16.d.ts +0 -8
- package/dist/datatypes/types/Int16.js +0 -17
- package/dist/datatypes/types/Int32.d.ts +0 -8
- package/dist/datatypes/types/Int32.js +0 -17
- package/dist/datatypes/types/Int64.d.ts +0 -8
- package/dist/datatypes/types/Int64.js +0 -17
- package/dist/datatypes/types/Int8.d.ts +0 -8
- package/dist/datatypes/types/Int8.js +0 -17
- package/dist/datatypes/types/List.d.ts +0 -10
- package/dist/datatypes/types/List.js +0 -31
- package/dist/datatypes/types/Null.d.ts +0 -9
- package/dist/datatypes/types/Null.js +0 -17
- package/dist/datatypes/types/Object.d.ts +0 -9
- package/dist/datatypes/types/Object.js +0 -17
- package/dist/datatypes/types/Struct.d.ts +0 -14
- package/dist/datatypes/types/Struct.js +0 -39
- package/dist/datatypes/types/Time.d.ts +0 -8
- package/dist/datatypes/types/Time.js +0 -29
- package/dist/datatypes/types/UInt16.d.ts +0 -8
- package/dist/datatypes/types/UInt16.js +0 -17
- package/dist/datatypes/types/UInt32.d.ts +0 -8
- package/dist/datatypes/types/UInt32.js +0 -17
- package/dist/datatypes/types/UInt64.d.ts +0 -8
- package/dist/datatypes/types/UInt64.js +0 -17
- package/dist/datatypes/types/UInt8.d.ts +0 -8
- package/dist/datatypes/types/UInt8.js +0 -17
- package/dist/datatypes/types/Utf8.d.ts +0 -10
- package/dist/datatypes/types/Utf8.js +0 -20
- package/dist/datatypes/types.js +0 -290
- package/dist/exceptions/index.js +0 -46
- package/dist/exceptions/utils.js +0 -28
- package/dist/functions/concat.js +0 -260
- package/dist/functions/index.js +0 -9
- package/dist/functions/read_csv.js +0 -53
- package/dist/functions/read_json.js +0 -21
- package/dist/functions/transpose.d.ts +0 -7
- package/dist/functions/transpose.js +0 -84
- package/dist/types.js +0 -2
- package/dist/utils/boolean.d.ts +0 -1
- package/dist/utils/boolean.js +0 -18
- package/dist/utils/csv.js +0 -313
- package/dist/utils/date.js +0 -348
- package/dist/utils/guards.d.ts +0 -12
- package/dist/utils/guards.js +0 -112
- package/dist/utils/index.js +0 -23
- package/dist/utils/json.js +0 -217
- package/dist/utils/list.js +0 -361
- package/dist/utils/number.js +0 -401
- package/dist/utils/string.js +0 -209
package/README.md
CHANGED
|
@@ -1,11 +1,39 @@
|
|
|
1
1
|
# 🚀 DFScript
|
|
2
2
|
|
|
3
|
+
[](https://github.com/trentamorris/df-script)
|
|
3
4
|
[](DONATIONS.md)
|
|
4
5
|
|
|
5
6
|
DFScript is a lightweight, high-performance, and **zero-dependency** data analysis library for TypeScript and JavaScript. Heavily inspired by modern dataframe libraries like **Polars** and **Pandas**, DFScript brings a robust, expression-based columnar data processing engine directly to the JavaScript ecosystem.
|
|
6
7
|
|
|
7
8
|
With optimized columnar storage under the hood, DFScript enables you to build clean, maintainable, and type-safe data pipelines using a declarative expression API.
|
|
8
9
|
|
|
10
|
+
## 💡 Why DFScript?
|
|
11
|
+
|
|
12
|
+
Like many developers, I spent years working on frontend codebases filled with deeply nested, unoptimized data processing loops. We've all seen them: chained `.map()`, `.filter()`, `.sort()`, and `.forEach()` loops processing arrays of objects. Each step in the chain allocates new intermediate arrays, triggers garbage collection thrashing, and operates on row-based layouts that slow down browser main threads.
|
|
13
|
+
|
|
14
|
+
When you need to perform complex analytical transformations on the client-side—handling missing values, formatting timezone-aware datetimes, parsing decimals, or computing rolling averages—relying on standard JavaScript array methods quickly becomes a performance and maintenance nightmare. There had to be a better, cleaner, and faster way to express these pipelines. I realized that if nobody else had built a lightweight, zero-dependency columnar expression engine for the JavaScript ecosystem yet, why not roll up my sleeves and build it myself?
|
|
15
|
+
|
|
16
|
+
DFScript was born from that frustration. It brings Polars-like columnar execution, strict domain namespaces (`.str`, `.dt`, `.arr`, `.struct`), and lazy/declarative expression compilation to JavaScript. Under the hood, it avoids intermediate array allocations and uses highly optimized loops with cached lengths, so your frontend code stays clean, type-safe, and incredibly fast.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 🗺️ Table of Contents
|
|
21
|
+
|
|
22
|
+
- [✨ Key Features](#-key-features)
|
|
23
|
+
- [⚙️ Compatibility & Design Principles](#-compatibility--design-principles)
|
|
24
|
+
- [🤝 Contributing & Collective Wisdom](#-contributing--collective-wisdom)
|
|
25
|
+
- [📦 Installation](#-installation)
|
|
26
|
+
- [🚀 Quick Start](#-quick-start)
|
|
27
|
+
- [📖 Core Concepts](#-core-concepts)
|
|
28
|
+
- [🛠️ DataFrame API Reference](#-dataframe-api-reference)
|
|
29
|
+
- [📂 File / Data I/O](#-file--data-io)
|
|
30
|
+
- [🧮 Expressions API Reference](#-expressions-api-reference)
|
|
31
|
+
- [📂 Namespaces](#-namespaces)
|
|
32
|
+
- [🪟 Window & Rolling Expressions](#-window--rolling-expressions)
|
|
33
|
+
- [🛡️ Typing and Schema Registry](#-typing-and-schema-registry)
|
|
34
|
+
- [🧑💻 Contributing & Development](#-contributing--development)
|
|
35
|
+
- [📄 License](#-license)
|
|
36
|
+
|
|
9
37
|
---
|
|
10
38
|
|
|
11
39
|
## ✨ Key Features
|
|
@@ -16,7 +44,8 @@ With optimized columnar storage under the hood, DFScript enables you to build cl
|
|
|
16
44
|
- 📂 **Strict Namespaces** — Clear API organization for specific domains:
|
|
17
45
|
- `.str` for advanced string manipulations.
|
|
18
46
|
- `.dt` for microsecond-precision datetimes, timezones, and duration calculations.
|
|
19
|
-
- `.
|
|
47
|
+
- `.arr` for robust array/list column operations.
|
|
48
|
+
- `.struct` for nested object and struct manipulation.
|
|
20
49
|
- 🪟 **Analytical Window Functions** — Windowing (`over()`), cumulative aggregations (`cum_sum()`, `cum_max()`), and rolling metrics (`rolling_mean()`, `rolling_std()`).
|
|
21
50
|
- 🛠️ **Relational Operations** — Rich, high-speed joins, pivots, unpivots, vertical/horizontal concatenations, and group-by aggregations.
|
|
22
51
|
- 🛡️ **Defensive & Type-Safe** — Native type-coercion, robust null-safety, and strict schema validation.
|
|
@@ -35,6 +64,14 @@ DFScript is designed with a **low-abstraction, zero-dependency** philosophy to g
|
|
|
35
64
|
|
|
36
65
|
---
|
|
37
66
|
|
|
67
|
+
## 🤝 Contributing & Collective Wisdom
|
|
68
|
+
|
|
69
|
+
We don’t pretend to have encountered every localized date format, database quirk, or environment-specific edge case. DFScript is built on the belief that software correctness is a collective endeavor.
|
|
70
|
+
|
|
71
|
+
If you run into an unsupported edge case or unexpected behavior in any of our functions, we want to hear about it. Help us harden this engine by opening a GitHub Issue or submitting a PR—every report makes the library more robust for everyone.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
38
75
|
## 📦 Installation
|
|
39
76
|
|
|
40
77
|
Install DFScript using your favorite package manager:
|
|
@@ -73,7 +110,7 @@ const processedDf = df.select(
|
|
|
73
110
|
$df.col("name").str.upper().alias("NAME_UPPER"),
|
|
74
111
|
$df.col("join_date").str.to_datetime().dt.year().alias("join_year"),
|
|
75
112
|
$df.col("sales").add(500).alias("sales_adjusted"),
|
|
76
|
-
$df.col("tags").
|
|
113
|
+
$df.col("tags").arr.lengths().alias("tag_count")
|
|
77
114
|
);
|
|
78
115
|
|
|
79
116
|
console.log(processedDf.to_dicts());
|
|
@@ -93,12 +130,20 @@ console.log(processedDf.to_dicts());
|
|
|
93
130
|
|
|
94
131
|
### The `$df` Entry Point
|
|
95
132
|
|
|
96
|
-
DFScript uses the `$df` namespace to bootstrap DataFrames, refer to columns, and access
|
|
133
|
+
DFScript uses the `$df` namespace to bootstrap DataFrames, refer to columns, build expressions, and access data types.
|
|
97
134
|
|
|
98
135
|
- `$df.data(dataRowsOrCols, schema?)`: Instantiates a new `DataFrame`.
|
|
99
136
|
- `$df.read_json(content, options?)`: Reads JSON/NDJSON content into a new `DataFrame`.
|
|
137
|
+
- `$df.read_csv(content, options?)`: Reads CSV content into a new `DataFrame`.
|
|
100
138
|
- `$df.col(name)`: Creates a column reference expression.
|
|
101
139
|
- `$df.all()`: Selects all columns in the DataFrame.
|
|
140
|
+
- `$df.exclude(columns)`: Creates an expression matching all columns except the specified ones.
|
|
141
|
+
- `$df.coalesce(...exprs)`: Returns the first non-null value among columns or literal expressions.
|
|
142
|
+
- `$df.lit(val)`: Explicitly wraps a raw value into a literal expression.
|
|
143
|
+
- `$df.when(predicate).then(value)...otherwise(value)`: Constructs a conditional expression (when-then-otherwise chain).
|
|
144
|
+
- `$df.implode(column)`: Aggregates a column's rows (or grouped values) into a list.
|
|
145
|
+
- `$df.seq_range(value, options?)`: Generates a sequence range of values.
|
|
146
|
+
- `$df.element()`: References the current array element within an `.arr.eval(...)` expression.
|
|
102
147
|
- `$df.DataType`: Direct access to the `DataTypeRegistry` for schema specification.
|
|
103
148
|
|
|
104
149
|
### DataFrames vs. Columns
|
|
@@ -154,6 +199,17 @@ DFScript provides helpers to serialize and parse data formats like JSON and CSV.
|
|
|
154
199
|
// Read Newline Delimited JSON (NDJSON)
|
|
155
200
|
const dfNdjson = $df.read_json('{"id": 1}\n{"id": 2}', { format: "ndjson" });
|
|
156
201
|
```
|
|
202
|
+
- **`$df.read_csv(content, options?)`**: Reads a CSV string and loads it into a new DataFrame, with automatic data type inference.
|
|
203
|
+
```typescript
|
|
204
|
+
import { $df } from "df-script";
|
|
205
|
+
|
|
206
|
+
const csvContent = "id,name,active\n1,Alice,true\n2,Bob,false";
|
|
207
|
+
const df = $df.read_csv(csvContent, {
|
|
208
|
+
separator: ",",
|
|
209
|
+
hasHeader: true,
|
|
210
|
+
inferSchema: true
|
|
211
|
+
});
|
|
212
|
+
```
|
|
157
213
|
|
|
158
214
|
### Writing Data
|
|
159
215
|
- **`df.write_json(file?, options?)`**: Serializes a DataFrame into a JSON or NDJSON string. If a file path or writable stream/object (with a `.write` method) is provided, writes/streams the content as a side-effect. Always returns the serialized string.
|
|
@@ -197,6 +253,23 @@ Chained mathematical functions execute cleanly with built-in null-safety (Kleene
|
|
|
197
253
|
- `.first()`, `.last()`
|
|
198
254
|
- `.any()`, `.all()`, `.any_null()`, `.all_null()`, `.n_unique()`
|
|
199
255
|
|
|
256
|
+
### 🔀 Control Flow & Conditionals
|
|
257
|
+
Construct dynamic `CASE WHEN` branches using the `$df.when` API:
|
|
258
|
+
```typescript
|
|
259
|
+
import { $df } from "df-script";
|
|
260
|
+
|
|
261
|
+
df.select(
|
|
262
|
+
$df.col("sales"),
|
|
263
|
+
$df.when($df.col("sales").gt(2000)).then("High Performance")
|
|
264
|
+
.when($df.col("sales").gt(1000)).then("Standard Performance")
|
|
265
|
+
.otherwise("Low Performance")
|
|
266
|
+
.alias("sales_category")
|
|
267
|
+
);
|
|
268
|
+
```
|
|
269
|
+
- `$df.when(predicate).then(value)`: Starts a conditional evaluation.
|
|
270
|
+
- `.when(predicate).then(value)`: Chains additional conditions.
|
|
271
|
+
- `.otherwise(value)`: Specifies the fallback value when no conditions match (returns a complete `ColumnExpr`).
|
|
272
|
+
|
|
200
273
|
---
|
|
201
274
|
|
|
202
275
|
## 📂 Namespaces
|
|
@@ -219,16 +292,39 @@ $df.col("timestamp").dt.year()
|
|
|
219
292
|
$df.col("timestamp").dt.strftime("%Y-%m-%d %H:%M:%S")
|
|
220
293
|
$df.col("duration").dt.total_seconds()
|
|
221
294
|
```
|
|
222
|
-
- **Datetime Methods**: `year()`, `month()`, `day()`, `hour()`, `minute()`, `second()`, `millisecond()`, `microsecond()`, `nanosecond()`, `weekday()`, `week()`, `quarter()`, `century()`, `millennium()`, `ordinal_day()`, `is_leap_year()`, `month_start()`, `month_end()`, `date()`, `time()`, `
|
|
295
|
+
- **Datetime Methods**: `year()`, `month()`, `day()`, `hour()`, `minute()`, `second()`, `millisecond()`, `microsecond()`, `nanosecond()`, `weekday()`, `week()`, `quarter()`, `century()`, `millennium()`, `ordinal_day()`, `is_leap_year()`, `month_start()`, `month_end()`, `date()`, `time()`, `offset_day(n, options?)`, `offset_business_day(n, options?)`, `utc_offset(timeZone?, options?)`, `epoch(unit)`, `timestamp(unit)`, `strftime(format, locale?)`.
|
|
223
296
|
- **Duration Methods**: `total_days()`, `total_hours()`, `total_minutes()`, `total_seconds()`, `total_milliseconds()`, `total_microseconds()`, `total_nanoseconds()`.
|
|
224
297
|
|
|
225
|
-
### 📊 List Operations (`.
|
|
226
|
-
Available on
|
|
298
|
+
### 📊 Array/List Operations (`.arr`)
|
|
299
|
+
Available on any array or list column expression via `.arr`:
|
|
300
|
+
```typescript
|
|
301
|
+
$df.col("tags").arr.contains("vip")
|
|
302
|
+
$df.col("matrix").arr.get(2)
|
|
303
|
+
|
|
304
|
+
// Element-wise manipulation inside arrays:
|
|
305
|
+
$df.col("numbers").arr.eval(element().mul(2)).alias("numbers_doubled")
|
|
306
|
+
$df.col("tags").arr.eval(element().str.to_uppercase()).alias("upper_tags")
|
|
307
|
+
```
|
|
308
|
+
- **Methods**: `lengths()`, `len()`, `get(idx, null_on_oob?)`, `first(null_on_oob?)`, `last(null_on_oob?)`, `gather(indices, null_on_oob?)`, `gather_every(n, offset?)`, `slice(offset, length?)`, `contains(item)`, `count_matches(item)`, `join(separator)`, `sort(descending?)`, `reverse()`, `unique()`, `sum()`, `mean()`, `median()`, `mode()`, `min()`, `max()`, `eval(expr)`.
|
|
309
|
+
|
|
310
|
+
### 🗃️ Struct/Object Operations (`.struct`)
|
|
311
|
+
Available on any struct or nested object column expression via `.struct`. You can access fields dynamically via properties or explicit methods:
|
|
227
312
|
```typescript
|
|
228
|
-
|
|
229
|
-
$df.col("
|
|
313
|
+
// Sibling fields access via Proxy
|
|
314
|
+
$df.col("address").struct.city.alias("city")
|
|
315
|
+
|
|
316
|
+
// Or using the explicit field method
|
|
317
|
+
$df.col("address").struct.field("city")
|
|
230
318
|
```
|
|
231
|
-
- **Methods**:
|
|
319
|
+
- **Methods**:
|
|
320
|
+
- `field(name)`: Accesses a field within the struct.
|
|
321
|
+
- `rename_fields(mapping)`: Renames fields in the struct based on a `{ oldKey: newKey }` mapping.
|
|
322
|
+
- `with_fields(fields)`: Adds or overrides fields in the struct. Accepts an array of aliased expressions or an object.
|
|
323
|
+
- `unnest()`: Expands the fields of the struct into individual top-level columns in a select projection.
|
|
324
|
+
```typescript
|
|
325
|
+
// Flattens the address struct into "city", "state", etc. at the top-level
|
|
326
|
+
df.select($df.col("address").struct.unnest())
|
|
327
|
+
```
|
|
232
328
|
|
|
233
329
|
---
|
|
234
330
|
|
|
@@ -291,6 +387,26 @@ const schema = {
|
|
|
291
387
|
const df = $df.data(rawData, schema);
|
|
292
388
|
```
|
|
293
389
|
|
|
390
|
+
### 🧠 TypeScript Type Inference & IDE Safety
|
|
391
|
+
|
|
392
|
+
When you pass a schema to `$df.data()`, DFScript's types automatically infer the target types of the fields, turning dynamic dataframes into compile-safe records. Your IDE will auto-complete column names and validate that operations match the underlying types.
|
|
393
|
+
|
|
394
|
+
```typescript
|
|
395
|
+
import { $df } from "df-script";
|
|
396
|
+
|
|
397
|
+
const schema = {
|
|
398
|
+
name: $df.DataType.Utf8,
|
|
399
|
+
age: $df.DataType.Int32,
|
|
400
|
+
is_active: $df.DataType.Boolean
|
|
401
|
+
};
|
|
402
|
+
|
|
403
|
+
// Inferred DataFrame type is DataFrame<{ name: string; age: number; is_active: boolean }>
|
|
404
|
+
const df = $df.data(rawData, schema);
|
|
405
|
+
|
|
406
|
+
// Full IDE autocomplete, type validation, and compiler safety!
|
|
407
|
+
const activeUsers = df.filter($df.col("is_active").eq(true));
|
|
408
|
+
```
|
|
409
|
+
|
|
294
410
|
### Supported Data Types
|
|
295
411
|
- **Integers**: `Int8`, `Int16`, `Int32`, `Int64`, `UInt8`, `UInt16`, `UInt32`, `UInt64`
|
|
296
412
|
- **Floats & Decimals**: `Float32`, `Float64`, `Decimal(precision?, scale?)`
|
package/dist/api.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DataFrame } from "./dataframe";
|
|
2
|
-
import { ColumnExpr, lit, all, exclude, coalesce, when, implode, seq_range, element } from "./columnExpressions";
|
|
2
|
+
import { ColumnExpr, lit, all, exclude, coalesce, when, implode, seq_range, element, struct } from "./columnExpressions";
|
|
3
3
|
import { DataType } from "./datatypes";
|
|
4
4
|
import { concat, read_json, read_csv } from "./functions";
|
|
5
5
|
import type { RowRecord, DataFrameSchema, ColumnDict, InferSchema } from "./types";
|
|
@@ -19,6 +19,7 @@ export declare const $df: {
|
|
|
19
19
|
implode: typeof implode;
|
|
20
20
|
seq_range: typeof seq_range;
|
|
21
21
|
element: typeof element;
|
|
22
|
+
struct: typeof struct;
|
|
22
23
|
DataType: {
|
|
23
24
|
Int8: import("./datatypes").Int8Type;
|
|
24
25
|
Int16: import("./datatypes").Int16Type;
|
|
@@ -40,7 +41,7 @@ export declare const $df: {
|
|
|
40
41
|
Duration: import("./datatypes").DurationType;
|
|
41
42
|
Object: import("./datatypes").ObjectType;
|
|
42
43
|
Null: import("./datatypes").NullType;
|
|
43
|
-
|
|
44
|
+
Array: <TInner>(inner: import("./datatypes").RegisteredDataType & DataType<TInner>) => import("./datatypes").ArrayType<TInner>;
|
|
44
45
|
Struct: <TFields extends RowRecord>(fields: { [K in keyof TFields]: import("./datatypes").RegisteredDataType & DataType<TFields[K]>; }) => import("./datatypes").StructType<TFields>;
|
|
45
46
|
};
|
|
46
47
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:"Inter", system-ui, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-400:oklch(70.4% .191 22.216);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-950:oklch(27.9% .077 45.635);--color-emerald-400:oklch(76.5% .177 163.223);--color-teal-300:oklch(85.5% .138 181.071);--color-teal-800:oklch(43.7% .078 188.216);--color-teal-950:oklch(27.7% .046 192.524);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-800:oklch(44.3% .11 240.79);--color-sky-950:oklch(29.3% .066 243.157);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-800:oklch(43.8% .218 303.724);--color-purple-950:oklch(29.1% .149 302.717);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-white:#fff;--spacing:.25rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--radius-lg:.5rem;--radius-xl:.75rem;--animate-bounce:bounce 1s infinite;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--font-outfit:"Outfit", system-ui, sans-serif}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.top-0{top:0}.z-30{z-index:30}.mx-auto{margin-inline:auto}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-20{margin-top:calc(var(--spacing) * 20)}.block{display:block}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-block{display:inline-block}.table{display:table}.h-32{height:calc(var(--spacing) * 32)}.h-44{height:calc(var(--spacing) * 44)}.max-h-\[500px\]{max-height:500px}.min-h-screen{min-height:100vh}.w-full{width:100%}.max-w-7xl{max-width:var(--container-7xl)}.flex-grow{flex-grow:1}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-bounce{animation:var(--animate-bounce)}.cursor-pointer{cursor:pointer}.resize-y{resize:vertical}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.self-start{align-self:flex-start}.\!truncate{text-overflow:ellipsis!important;white-space:nowrap!important;overflow:hidden!important}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-amber-800\/50{border-color:#953d0080}@supports (color:color-mix(in lab,red,red)){.border-amber-800\/50{border-color:color-mix(in oklab,var(--color-amber-800) 50%,transparent)}}.border-blue-800\/50{border-color:#193cb880}@supports (color:color-mix(in lab,red,red)){.border-blue-800\/50{border-color:color-mix(in oklab,var(--color-blue-800) 50%,transparent)}}.border-indigo-500\/30{border-color:#625fff4d}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/30{border-color:color-mix(in oklab,var(--color-indigo-500) 30%,transparent)}}.border-purple-800\/50{border-color:#6e11b080}@supports (color:color-mix(in lab,red,red)){.border-purple-800\/50{border-color:color-mix(in oklab,var(--color-purple-800) 50%,transparent)}}.border-sky-800\/50{border-color:#00598680}@supports (color:color-mix(in lab,red,red)){.border-sky-800\/50{border-color:color-mix(in oklab,var(--color-sky-800) 50%,transparent)}}.border-slate-800{border-color:var(--color-slate-800)}.border-slate-800\/30{border-color:#1d293d4d}@supports (color:color-mix(in lab,red,red)){.border-slate-800\/30{border-color:color-mix(in oklab,var(--color-slate-800) 30%,transparent)}}.border-slate-800\/40{border-color:#1d293d66}@supports (color:color-mix(in lab,red,red)){.border-slate-800\/40{border-color:color-mix(in oklab,var(--color-slate-800) 40%,transparent)}}.border-slate-800\/50{border-color:#1d293d80}@supports (color:color-mix(in lab,red,red)){.border-slate-800\/50{border-color:color-mix(in oklab,var(--color-slate-800) 50%,transparent)}}.border-slate-800\/60{border-color:#1d293d99}@supports (color:color-mix(in lab,red,red)){.border-slate-800\/60{border-color:color-mix(in oklab,var(--color-slate-800) 60%,transparent)}}.border-slate-800\/80{border-color:#1d293dcc}@supports (color:color-mix(in lab,red,red)){.border-slate-800\/80{border-color:color-mix(in oklab,var(--color-slate-800) 80%,transparent)}}.border-teal-800\/50{border-color:#005f5a80}@supports (color:color-mix(in lab,red,red)){.border-teal-800\/50{border-color:color-mix(in oklab,var(--color-teal-800) 50%,transparent)}}.border-transparent{border-color:#0000}.bg-amber-950\/50{background-color:#46190180}@supports (color:color-mix(in lab,red,red)){.bg-amber-950\/50{background-color:color-mix(in oklab,var(--color-amber-950) 50%,transparent)}}.bg-blue-950\/50{background-color:#16245680}@supports (color:color-mix(in lab,red,red)){.bg-blue-950\/50{background-color:color-mix(in oklab,var(--color-blue-950) 50%,transparent)}}.bg-indigo-500\/20{background-color:#625fff33}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/20{background-color:color-mix(in oklab,var(--color-indigo-500) 20%,transparent)}}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-purple-950\/50{background-color:#3c036680}@supports (color:color-mix(in lab,red,red)){.bg-purple-950\/50{background-color:color-mix(in oklab,var(--color-purple-950) 50%,transparent)}}.bg-sky-950\/50{background-color:#052f4a80}@supports (color:color-mix(in lab,red,red)){.bg-sky-950\/50{background-color:color-mix(in oklab,var(--color-sky-950) 50%,transparent)}}.bg-slate-900\/40{background-color:#0f172b66}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/40{background-color:color-mix(in oklab,var(--color-slate-900) 40%,transparent)}}.bg-slate-900\/60{background-color:#0f172b99}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/60{background-color:color-mix(in oklab,var(--color-slate-900) 60%,transparent)}}.bg-slate-950\/40{background-color:#02061866}@supports (color:color-mix(in lab,red,red)){.bg-slate-950\/40{background-color:color-mix(in oklab,var(--color-slate-950) 40%,transparent)}}.bg-slate-950\/50{background-color:#02061880}@supports (color:color-mix(in lab,red,red)){.bg-slate-950\/50{background-color:color-mix(in oklab,var(--color-slate-950) 50%,transparent)}}.bg-slate-950\/80{background-color:#020618cc}@supports (color:color-mix(in lab,red,red)){.bg-slate-950\/80{background-color:color-mix(in oklab,var(--color-slate-950) 80%,transparent)}}.bg-teal-950\/50{background-color:#022f2e80}@supports (color:color-mix(in lab,red,red)){.bg-teal-950\/50{background-color:color-mix(in oklab,var(--color-teal-950) 50%,transparent)}}.bg-transparent{background-color:#0000}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-12{padding:calc(var(--spacing) * 12)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-12{padding-block:calc(var(--spacing) * 12)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.font-outfit{font-family:var(--font-outfit)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-300{color:var(--color-amber-300)}.text-blue-300{color:var(--color-blue-300)}.text-emerald-400{color:var(--color-emerald-400)}.text-indigo-200{color:var(--color-indigo-200)}.text-indigo-300{color:var(--color-indigo-300)}.text-indigo-400{color:var(--color-indigo-400)}.text-purple-300{color:var(--color-purple-300)}.text-red-400{color:var(--color-red-400)}.text-sky-300{color:var(--color-sky-300)}.text-slate-100{color:var(--color-slate-100)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-teal-300{color:var(--color-teal-300)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.select-none{-webkit-user-select:none;user-select:none}.focus-within\:border-indigo-500:focus-within{border-color:var(--color-indigo-500)}@media (hover:hover){.hover\:border-indigo-500\/40:hover{border-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.hover\:border-indigo-500\/40:hover{border-color:color-mix(in oklab,var(--color-indigo-500) 40%,transparent)}}.hover\:border-slate-300:hover{border-color:var(--color-slate-300)}.hover\:bg-indigo-500:hover{background-color:var(--color-indigo-500)}.hover\:bg-slate-900:hover{background-color:var(--color-slate-900)}.hover\:bg-slate-900\/20:hover{background-color:#0f172b33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-slate-900\/20:hover{background-color:color-mix(in oklab,var(--color-slate-900) 20%,transparent)}}.hover\:text-white:hover{color:var(--color-white)}.hover\:shadow-indigo-500\/20:hover{--tw-shadow-color:#625fff33}@supports (color:color-mix(in lab,red,red)){.hover\:shadow-indigo-500\/20:hover{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-indigo-500) 20%, transparent) var(--tw-shadow-alpha), transparent)}}}.focus\:border-indigo-500:focus{border-color:var(--color-indigo-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}@media (min-width:40rem){.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}}@media (min-width:48rem){.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-between{justify-content:space-between}}@media (min-width:64rem){.lg\:col-span-5{grid-column:span 5/span 5}.lg\:col-span-7{grid-column:span 7/span 7}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}}}body{color:#f3f4f6;font-family:var(--font-sans);background-color:#0b0f19;margin:0;overflow-x:hidden}.glass-bg-glow{pointer-events:none;z-index:-1;background:radial-gradient(circle at 10% 20%,#6366f114,#0000 40%),radial-gradient(circle at 90% 80%,#a855f714,#0000 45%);position:fixed;top:0;right:0;bottom:0;left:0}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:#ffffff05}::-webkit-scrollbar-thumb{background:#ffffff1a;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#fff3}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}
|