From 118a07dc997f63f85a63fc998ea25801c9982f14 Mon Sep 17 00:00:00 2001 From: Graziella Camata Date: Thu, 12 Mar 2026 11:40:10 -0700 Subject: [PATCH 01/10] [claude] claude.md additions (#24554) ## Reason Explain *why* this change is being made. ## Overview For large or complex changes, describe what is being changed. ## Test Plan Explain how you tested the change. GitOrigin-RevId: 9644a9351168d7cb15db875c489a13f8488354c7 --- CLAUDE.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index 190b21a94..842ae9dd0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -45,6 +45,11 @@ yarn workspace @lightsparkdev/ui test - Use workspace protocol for internal deps: `"@lightsparkdev/ui": "*"` - Shared configs: `@lightsparkdev/{tsconfig,eslint-config}` +### Enums +Always use generated TypeScript enums from `src/generated/graphql` rather than raw strings. This ensures type safety and keeps code in sync with the schema. + +For unselected state, use `null` (not empty strings or union types like `Type | ""`). Example: `useState(null)`. + ### GraphQL After Python schema changes: ```bash From 6335d51ada54adfec833328e719561e10ac2c75d Mon Sep 17 00:00:00 2001 From: Graziella Camata Date: Thu, 12 Mar 2026 15:43:01 -0700 Subject: [PATCH 02/10] [claude.md] update enums directives (#24857) GitOrigin-RevId: 25e8a0d853f994f63c8cbb7fe95eb73e74749c4f --- CLAUDE.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 842ae9dd0..9cb1ab5d8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -46,9 +46,8 @@ yarn workspace @lightsparkdev/ui test - Shared configs: `@lightsparkdev/{tsconfig,eslint-config}` ### Enums -Always use generated TypeScript enums from `src/generated/graphql` rather than raw strings. This ensures type safety and keeps code in sync with the schema. - -For unselected state, use `null` (not empty strings or union types like `Type | ""`). Example: `useState(null)`. +Prefer generated TypeScript enums from `src/generated/graphql` rather than raw strings when +available. This ensures type safety and keeps code in sync with the schema. ### GraphQL After Python schema changes: From aefefea1759cddee51f9dd33190439e6269f448b Mon Sep 17 00:00:00 2001 From: Jeremy Klein Date: Thu, 12 Mar 2026 17:22:38 -0700 Subject: [PATCH 03/10] Update the onboarding UI for grid with the new API tokens (#24836) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updating the UI to a 2-step dialog that Pat designed. See screenshots: ![Screenshot 2026-03-12 at 12.25.44 AM.png](https://app.graphite.com/user-attachments/assets/e9bcbcbd-76e4-45f8-8481-5540394a8caf.png) ![Screenshot 2026-03-12 at 12.25.21 AM.png](https://app.graphite.com/user-attachments/assets/ab848685-e1ed-4429-a221-efcdf8c24abe.png) --------- Co-authored-by: Claude GitOrigin-RevId: a7ad068a39452f6b45002dfeab88f7b70426b56a --- packages/ui/src/icons/GridLogo.tsx | 19 +++++++++++++++++++ packages/ui/src/icons/index.tsx | 1 + 2 files changed, 20 insertions(+) create mode 100644 packages/ui/src/icons/GridLogo.tsx diff --git a/packages/ui/src/icons/GridLogo.tsx b/packages/ui/src/icons/GridLogo.tsx new file mode 100644 index 000000000..a6d1950d7 --- /dev/null +++ b/packages/ui/src/icons/GridLogo.tsx @@ -0,0 +1,19 @@ +import { type PathProps } from "./types.js"; + +export function GridLogo({ fill = "currentColor" }: PathProps) { + return ( + + + + ); +} diff --git a/packages/ui/src/icons/index.tsx b/packages/ui/src/icons/index.tsx index e550ea77b..8f81d48bc 100644 --- a/packages/ui/src/icons/index.tsx +++ b/packages/ui/src/icons/index.tsx @@ -73,6 +73,7 @@ export { Globe } from "./Globe.js"; export { Globus } from "./Globus.js"; export { GoTwoTone } from "./GoTwoTone.js"; export { GraphQLTwoTone } from "./GraphQLTwoTone.js"; +export { GridLogo } from "./GridLogo.js"; export { HeartOutline } from "./HeartOutline.js"; export { Home } from "./Home.js"; export { Info } from "./Info.js"; From 01d83bb7e7d05f878728de3863db1a49ad4e31bc Mon Sep 17 00:00:00 2001 From: Alex Weil Date: Mon, 16 Mar 2026 10:35:51 -0700 Subject: [PATCH 04/10] Use a bigint for nonces, so we don't accidentally truncate bytes (#24885) `getNonce` now returns a bigint to preserve the full 64 bits of randomness in the nonce. The nonce used for request signing is generated from two random 32-bit integers combined into a single 64-bit value. Previously this was returned as a JavaScript number, which only has 53 bits of integer precision (`Number.MAX_SAFE_INTEGER` is `2^53 - 1`). Any nonce above that threshold (so 99.95% of them) would be silently rounded to the nearest representable float, reducing the effective entropy of the nonce and increasing the probability of collisions across requests. This change switches `getNonce` to return a `bigint`, preserving all 64 bits. The nonce is serialized as a string in the JSON request payload to avoid precision loss on the wire as well. GitOrigin-RevId: 138c1967aebcf55e0e7467ea86c6ae6ca4743e5d --- packages/core/src/crypto/crypto.ts | 7 ++----- packages/core/src/crypto/tests/crypto.test.ts | 20 ++++++++++++++++++- packages/core/src/requester/Requester.ts | 2 +- .../requester/tests/DefaultRequester.test.ts | 2 +- .../src/requester/tests/Requester.test.ts | 2 +- 5 files changed, 24 insertions(+), 9 deletions(-) diff --git a/packages/core/src/crypto/crypto.ts b/packages/core/src/crypto/crypto.ts index 0f226fa80..1bce3e26f 100644 --- a/packages/core/src/crypto/crypto.ts +++ b/packages/core/src/crypto/crypto.ts @@ -24,7 +24,7 @@ export type CryptoInterface = { format: "pkcs8" | "spki", ) => Promise; - getNonce: () => Promise; + getNonce: () => Promise; sign: ( keyOrAlias: CryptoKey | string, @@ -229,10 +229,7 @@ const serializeSigningKey = async ( const getNonce = async () => { const nonceSt = await getRandomValues32(new Uint32Array(2)); const [upper, lower] = nonceSt; - const nonce = (BigInt(upper) << 32n) | BigInt(lower); - // Note: We lose some precision here going from bigint to number - // because js numbers are floats, but it's ok. - return Number(nonce); + return (BigInt(upper) << 32n) | BigInt(lower); }; const sign = async ( diff --git a/packages/core/src/crypto/tests/crypto.test.ts b/packages/core/src/crypto/tests/crypto.test.ts index cb44bc9e5..8aaf7a0df 100644 --- a/packages/core/src/crypto/tests/crypto.test.ts +++ b/packages/core/src/crypto/tests/crypto.test.ts @@ -21,6 +21,24 @@ describe("Crypto tests", () => { test("should generate a valid nonce", async () => { const nonce = await DefaultCrypto.getNonce(); - expect(nonce).toBeGreaterThan(0); + expect(nonce > 0n).toBe(true); + }, 10_000); + + test("should generate nonces that exceed Number.MAX_SAFE_INTEGER without precision loss", async () => { + const nonces = await Promise.all( + Array.from({ length: 100 }, () => DefaultCrypto.getNonce()), + ); + const maxSafeInteger = BigInt(Number.MAX_SAFE_INTEGER); + + for (const nonce of nonces) { + expect(typeof nonce).toBe("bigint"); + // A 64-bit nonce converted to Number and back will lose precision if it + // exceeds MAX_SAFE_INTEGER. Verify the round-trip is lossless: + expect(BigInt(nonce.toString())).toBe(nonce); + } + // With 64 bits, at least some nonces should exceed MAX_SAFE_INTEGER. The + // probability of all 100 fitting in 53 bits is negligible (~2^-1100). + const hasLargeNonce = nonces.some((n: bigint) => n > maxSafeInteger); + expect(hasLargeNonce).toBe(true); }, 10_000); }); diff --git a/packages/core/src/requester/Requester.ts b/packages/core/src/requester/Requester.ts index dc205f5c7..a58573404 100644 --- a/packages/core/src/requester/Requester.ts +++ b/packages/core/src/requester/Requester.ts @@ -284,7 +284,7 @@ class Requester { query, variables, operationName, - nonce, + nonce: nonce.toString(), expires_at: expiration, }; diff --git a/packages/core/src/requester/tests/DefaultRequester.test.ts b/packages/core/src/requester/tests/DefaultRequester.test.ts index fbba59693..97283f947 100644 --- a/packages/core/src/requester/tests/DefaultRequester.test.ts +++ b/packages/core/src/requester/tests/DefaultRequester.test.ts @@ -67,7 +67,7 @@ describe("DefaultRequester", () => { }), ), serializeSigningKey: jest.fn(() => Promise.resolve(new ArrayBuffer(0))), - getNonce: jest.fn(() => Promise.resolve(123)), + getNonce: jest.fn(() => Promise.resolve(123n)), sign: jest.fn(() => Promise.resolve(new ArrayBuffer(0))), importPrivateSigningKey: jest.fn(() => Promise.resolve("")), } satisfies CryptoInterface; diff --git a/packages/core/src/requester/tests/Requester.test.ts b/packages/core/src/requester/tests/Requester.test.ts index f602a0810..6c9651795 100644 --- a/packages/core/src/requester/tests/Requester.test.ts +++ b/packages/core/src/requester/tests/Requester.test.ts @@ -68,7 +68,7 @@ describe("Requester", () => { }), ), serializeSigningKey: jest.fn(() => Promise.resolve(new ArrayBuffer(0))), - getNonce: jest.fn(() => Promise.resolve(123)), + getNonce: jest.fn(() => Promise.resolve(123n)), sign: jest.fn(() => Promise.resolve(new ArrayBuffer(0))), importPrivateSigningKey: jest.fn(() => Promise.resolve("")), } satisfies CryptoInterface; From fbc790160a64f434bd4335d6cbdaecbc8bb7e659 Mon Sep 17 00:00:00 2001 From: Brian Siao Tick Chong Date: Mon, 16 Mar 2026 14:25:56 -0700 Subject: [PATCH 05/10] Add Grid API dashboard proxy for direct REST calls (#24803) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Reason The Grid Dashboard (uma-nage) currently needs GraphQL queries/mutations for every Grid API endpoint it wants to call. This creates maintenance overhead and duplicates API definitions. By adding a REST proxy, the dashboard can call Grid API endpoints directly using the session user's authentication, eliminating the need for separate GraphQL wrappers. ## Overview This change introduces a dashboard proxy that allows the uma-nage frontend to call Grid API endpoints directly via REST: **Backend (`sparkcore/sparkcore/grid/dashboard_proxy.py`)** - New blueprint at `/grid-dashboard-api/` that proxies requests to Grid API handlers - Validates the session user has a Nage role (administrator, developer, compliance, or support) - Blocks impersonation sessions - Resolves the target platform from the `X-Grid-Platform-Id` header with soft-delete check - Verifies the user belongs to the same account as the platform - Write operations (POST/PUT/PATCH/DELETE) restricted to admin/developer roles - Auth failure logging on all rejection paths - Error messages sanitized to avoid leaking internal paths - Module-level assertion on `bp_rc.url_prefix` instead of fragile fallback - Dispatches to the matching `/grid/rc/` handler via `create_url_adapter` (respects host_matching) **Security hardening** - `g.grid_proxy_verified_platform` attribute name is specific to avoid accidental collision - `GkPlatformConstraint.gen_evaluate` now checks `g.grid_proxy_verified_platform` so platform-scoped gatekeeper rules work for proxy requests - `UserRole(r)` parsing skips unknown role strings to prevent crash on roles added before code deploy - `platform_context.py` uses `getattr` guard with descriptive `RuntimeError` instead of bare `AttributeError` - CSRF defense documented (SameSite=Strict session cookies) - Comments document dispatch hook bypass and gatekeeper constraint behavior **Frontend (`js/apps/private/site/src/uma-nage/gridApiClient.ts`)** - `gridApiFetch()` function for calling Grid API endpoints via the proxy - TypeScript types for Grid API responses (`GridExternalAccount`, `GridListResponse`, `GridError`) - Convenience helpers for specific endpoints (`getPlatformConfig`, `listCustomerExternalAccounts`, `listPlatformExternalAccounts`) - Handles LSID-to-UUID conversion for platform IDs **Frontend Hook (`js/apps/private/site/src/uma-nage/hooks/useGridApi.ts`)** - React hook `useGridApiQuery()` for querying Grid API endpoints - Provides loading/error state management similar to Apollo's `useQuery` pattern - `refetch` parameter type tightened to prevent silent `[object Object]` serialization **Tests (`test_dashboard_proxy.py` — 11 tests)** - No session → 401 - Impersonation session → 403 - Non-Nage role → 403 - Read-only role + POST → 403 - Missing `X-Grid-Platform-Id` header → 400 - Invalid UUID in header → 400 - Nonexistent platform → 404 - Soft-deleted platform → 404 - Wrong account → 403 - Happy path GET `/config` → 200 - Guard: `bp_rc` has no before_request/after_request hooks **Bug fix (`sparkcore/sparkcore/grid/utils/account.py`)** - `gen_customer_owned_external_accounts_query` now uses `get_grid_platform_id()` instead of `vc.getx_umaaas_client().platform_id`, fixing a crash when called via the dashboard proxy ## Test Plan - [x] `ruff check` and `ruff format --check` pass on `sparkcore/grid/` - [x] `getx_umaaas_client` grep shows only guarded uses in `platform_context.py`, `grid_api.py`, `delete_api_token.py` - [x] `pytest test_dashboard_proxy.py` — 11/11 pass - [x] `yarn build` passes - [x] `yarn lint` passes ## Architecture ```mermaid sequenceDiagram participant B as Browser (uma-nage) participant P as Dashboard Proxy
/grid-dashboard-api participant H as Grid API Handler
/grid/rc/* B->>P: REST request + session cookie
+ X-Grid-Platform-Id header rect rgb(255, 245, 238) Note over P: Validation chain P->>P: 1. Session auth (401) P->>P: 2. Block impersonation (403) P->>P: 3. Nage role check (403) P->>P: 4. Write-role gate for non-GET (403) P->>P: 5. Resolve platform from header (400/404) P->>P: 6. Account match (403) end Note over P: Store platform on g.grid_proxy_verified_platform P->>H: Dispatch via URL adapter match rect rgb(240, 248, 255) Note over H: @grid_api decorator H->>H: Gatekeeper check H->>H: Rate limiting end H-->>P: JSON response P-->>B: JSON response ``` --------- Co-authored-by: Claude GitOrigin-RevId: 815efdd7c07618b123869a7b61fe1ed84c7d4f50 --- packages/vite/index.cjs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/vite/index.cjs b/packages/vite/index.cjs index db2aed0ba..e33d2cd45 100644 --- a/packages/vite/index.cjs +++ b/packages/vite/index.cjs @@ -96,6 +96,10 @@ module.exports.buildConfig = ({ target: proxyTarget, changeOrigin: true, }, + "/grid-dashboard-api": { + target: proxyTarget, + changeOrigin: true, + }, "/graphql/paycore-internal": { target: proxyTarget === "http://127.0.0.1:5000" From 6487cd299f4de3b47a5b12fa69ff00c52a7d755d Mon Sep 17 00:00:00 2001 From: Matt Davis Date: Wed, 18 Mar 2026 11:29:49 -0700 Subject: [PATCH 06/10] PX-1620: Add Wave 1 currencies and fix VASP CurrencyPreference usage (#25061) Add 7 new currencies to FiatCurrencyUnit, CurrencyUnit, and JS currency.ts: BDT (Bangladeshi Taka), COP (Colombian Peso), EGP (Egyptian Pound), GHS (Ghanaian Cedi), HTG (Haitian Gourde), JMD (Jamaican Dollar), PKR (Pakistani Rupee) Fix ThunesGridReceiverVasp to use correct CurrencyPreference constructor (currency=Currency(...), min_sendable, max_sendable) and extract to THUNES_CURRENCY_PREFERENCES constant. Includes GraphQL schema regeneration and JS codegen output. Co-Authored-By: Claude Opus 4.6 (1M context) GitOrigin-RevId: e9d1e12dbb8d47bec8c2b05b5575df4fa4ba1bba --- packages/core/src/utils/currency.ts | 156 ++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) diff --git a/packages/core/src/utils/currency.ts b/packages/core/src/utils/currency.ts index 3c8bf6922..40d361114 100644 --- a/packages/core/src/utils/currency.ts +++ b/packages/core/src/utils/currency.ts @@ -45,7 +45,14 @@ export const CurrencyUnit = { RWF: "RWF", ZMW: "ZMW", AED: "AED", + BDT: "BDT", + COP: "COP", + EGP: "EGP", + GHS: "GHS", GTQ: "GTQ", + HTG: "HTG", + JMD: "JMD", + PKR: "PKR", USDT: "USDT", USDC: "USDC", @@ -62,6 +69,14 @@ export const CurrencyUnit = { Inr: "INR", Brl: "BRL", Aed: "AED", + Bdt: "BDT", + Cop: "COP", + Egp: "EGP", + Ghs: "GHS", + Gtq: "GTQ", + Htg: "HTG", + Jmd: "JMD", + Pkr: "PKR", Usdt: "USDT", Usdc: "USDC", } as const; @@ -116,7 +131,14 @@ const standardUnitConversionObj = { [CurrencyUnit.RWF]: (v: number) => v, [CurrencyUnit.ZMW]: (v: number) => v, [CurrencyUnit.AED]: (v: number) => v, + [CurrencyUnit.BDT]: (v: number) => v, + [CurrencyUnit.COP]: (v: number) => v, + [CurrencyUnit.EGP]: (v: number) => v, + [CurrencyUnit.GHS]: (v: number) => v, [CurrencyUnit.GTQ]: (v: number) => v, + [CurrencyUnit.HTG]: (v: number) => v, + [CurrencyUnit.JMD]: (v: number) => v, + [CurrencyUnit.PKR]: (v: number) => v, [CurrencyUnit.USDT]: (v: number) => v, [CurrencyUnit.USDC]: (v: number) => v, }; @@ -170,7 +192,14 @@ const CONVERSION_MAP = { [CurrencyUnit.RWF]: toBitcoinConversion, [CurrencyUnit.ZMW]: toBitcoinConversion, [CurrencyUnit.AED]: toBitcoinConversion, + [CurrencyUnit.BDT]: toBitcoinConversion, + [CurrencyUnit.COP]: toBitcoinConversion, + [CurrencyUnit.EGP]: toBitcoinConversion, + [CurrencyUnit.GHS]: toBitcoinConversion, [CurrencyUnit.GTQ]: toBitcoinConversion, + [CurrencyUnit.HTG]: toBitcoinConversion, + [CurrencyUnit.JMD]: toBitcoinConversion, + [CurrencyUnit.PKR]: toBitcoinConversion, [CurrencyUnit.USDT]: toBitcoinConversion, [CurrencyUnit.USDC]: toBitcoinConversion, }, @@ -208,7 +237,14 @@ const CONVERSION_MAP = { [CurrencyUnit.RWF]: toMicrobitcoinConversion, [CurrencyUnit.ZMW]: toMicrobitcoinConversion, [CurrencyUnit.AED]: toMicrobitcoinConversion, + [CurrencyUnit.BDT]: toMicrobitcoinConversion, + [CurrencyUnit.COP]: toMicrobitcoinConversion, + [CurrencyUnit.EGP]: toMicrobitcoinConversion, + [CurrencyUnit.GHS]: toMicrobitcoinConversion, [CurrencyUnit.GTQ]: toMicrobitcoinConversion, + [CurrencyUnit.HTG]: toMicrobitcoinConversion, + [CurrencyUnit.JMD]: toMicrobitcoinConversion, + [CurrencyUnit.PKR]: toMicrobitcoinConversion, [CurrencyUnit.USDT]: toMicrobitcoinConversion, [CurrencyUnit.USDC]: toMicrobitcoinConversion, }, @@ -246,7 +282,14 @@ const CONVERSION_MAP = { [CurrencyUnit.RWF]: toMillibitcoinConversion, [CurrencyUnit.ZMW]: toMillibitcoinConversion, [CurrencyUnit.AED]: toMillibitcoinConversion, + [CurrencyUnit.BDT]: toMillibitcoinConversion, + [CurrencyUnit.COP]: toMillibitcoinConversion, + [CurrencyUnit.EGP]: toMillibitcoinConversion, + [CurrencyUnit.GHS]: toMillibitcoinConversion, [CurrencyUnit.GTQ]: toMillibitcoinConversion, + [CurrencyUnit.HTG]: toMillibitcoinConversion, + [CurrencyUnit.JMD]: toMillibitcoinConversion, + [CurrencyUnit.PKR]: toMillibitcoinConversion, [CurrencyUnit.USDT]: toMillibitcoinConversion, [CurrencyUnit.USDC]: toMillibitcoinConversion, }, @@ -284,7 +327,14 @@ const CONVERSION_MAP = { [CurrencyUnit.RWF]: toMillisatoshiConversion, [CurrencyUnit.ZMW]: toMillisatoshiConversion, [CurrencyUnit.AED]: toMillisatoshiConversion, + [CurrencyUnit.BDT]: toMillisatoshiConversion, + [CurrencyUnit.COP]: toMillisatoshiConversion, + [CurrencyUnit.EGP]: toMillisatoshiConversion, + [CurrencyUnit.GHS]: toMillisatoshiConversion, [CurrencyUnit.GTQ]: toMillisatoshiConversion, + [CurrencyUnit.HTG]: toMillisatoshiConversion, + [CurrencyUnit.JMD]: toMillisatoshiConversion, + [CurrencyUnit.PKR]: toMillisatoshiConversion, [CurrencyUnit.USDT]: toMillisatoshiConversion, [CurrencyUnit.USDC]: toMillisatoshiConversion, }, @@ -322,7 +372,14 @@ const CONVERSION_MAP = { [CurrencyUnit.RWF]: toNanobitcoinConversion, [CurrencyUnit.ZMW]: toNanobitcoinConversion, [CurrencyUnit.AED]: toNanobitcoinConversion, + [CurrencyUnit.BDT]: toNanobitcoinConversion, + [CurrencyUnit.COP]: toNanobitcoinConversion, + [CurrencyUnit.EGP]: toNanobitcoinConversion, + [CurrencyUnit.GHS]: toNanobitcoinConversion, [CurrencyUnit.GTQ]: toNanobitcoinConversion, + [CurrencyUnit.HTG]: toNanobitcoinConversion, + [CurrencyUnit.JMD]: toNanobitcoinConversion, + [CurrencyUnit.PKR]: toNanobitcoinConversion, [CurrencyUnit.USDT]: toNanobitcoinConversion, [CurrencyUnit.USDC]: toNanobitcoinConversion, }, @@ -360,7 +417,14 @@ const CONVERSION_MAP = { [CurrencyUnit.RWF]: toSatoshiConversion, [CurrencyUnit.ZMW]: toSatoshiConversion, [CurrencyUnit.AED]: toSatoshiConversion, + [CurrencyUnit.BDT]: toSatoshiConversion, + [CurrencyUnit.COP]: toSatoshiConversion, + [CurrencyUnit.EGP]: toSatoshiConversion, + [CurrencyUnit.GHS]: toSatoshiConversion, [CurrencyUnit.GTQ]: toSatoshiConversion, + [CurrencyUnit.HTG]: toSatoshiConversion, + [CurrencyUnit.JMD]: toSatoshiConversion, + [CurrencyUnit.PKR]: toSatoshiConversion, [CurrencyUnit.USDT]: toSatoshiConversion, [CurrencyUnit.USDC]: toSatoshiConversion, }, @@ -391,7 +455,14 @@ const CONVERSION_MAP = { [CurrencyUnit.RWF]: standardUnitConversionObj, [CurrencyUnit.ZMW]: standardUnitConversionObj, [CurrencyUnit.AED]: standardUnitConversionObj, + [CurrencyUnit.BDT]: standardUnitConversionObj, + [CurrencyUnit.COP]: standardUnitConversionObj, + [CurrencyUnit.EGP]: standardUnitConversionObj, + [CurrencyUnit.GHS]: standardUnitConversionObj, [CurrencyUnit.GTQ]: standardUnitConversionObj, + [CurrencyUnit.HTG]: standardUnitConversionObj, + [CurrencyUnit.JMD]: standardUnitConversionObj, + [CurrencyUnit.PKR]: standardUnitConversionObj, [CurrencyUnit.USDT]: standardUnitConversionObj, [CurrencyUnit.USDC]: standardUnitConversionObj, }; @@ -482,7 +553,14 @@ export type CurrencyMap = { [CurrencyUnit.RWF]: number; [CurrencyUnit.ZMW]: number; [CurrencyUnit.AED]: number; + [CurrencyUnit.BDT]: number; + [CurrencyUnit.COP]: number; + [CurrencyUnit.EGP]: number; + [CurrencyUnit.GHS]: number; [CurrencyUnit.GTQ]: number; + [CurrencyUnit.HTG]: number; + [CurrencyUnit.JMD]: number; + [CurrencyUnit.PKR]: number; [CurrencyUnit.USDT]: number; [CurrencyUnit.USDC]: number; [CurrencyUnit.FUTURE_VALUE]: number; @@ -523,7 +601,14 @@ export type CurrencyMap = { [CurrencyUnit.RWF]: string; [CurrencyUnit.ZMW]: string; [CurrencyUnit.AED]: string; + [CurrencyUnit.BDT]: string; + [CurrencyUnit.COP]: string; + [CurrencyUnit.EGP]: string; + [CurrencyUnit.GHS]: string; [CurrencyUnit.GTQ]: string; + [CurrencyUnit.HTG]: string; + [CurrencyUnit.JMD]: string; + [CurrencyUnit.PKR]: string; [CurrencyUnit.USDT]: string; [CurrencyUnit.USDC]: string; [CurrencyUnit.FUTURE_VALUE]: string; @@ -745,7 +830,14 @@ function convertCurrencyAmountValues( rwf: CurrencyUnit.RWF, zmw: CurrencyUnit.ZMW, aed: CurrencyUnit.AED, + bdt: CurrencyUnit.BDT, + cop: CurrencyUnit.COP, + egp: CurrencyUnit.EGP, + ghs: CurrencyUnit.GHS, gtq: CurrencyUnit.GTQ, + htg: CurrencyUnit.HTG, + jmd: CurrencyUnit.JMD, + pkr: CurrencyUnit.PKR, mibtc: CurrencyUnit.MICROBITCOIN, mlbtc: CurrencyUnit.MILLIBITCOIN, nbtc: CurrencyUnit.NANOBITCOIN, @@ -831,7 +923,14 @@ export function mapCurrencyAmount( rwf, zmw, aed, + bdt, + cop, + egp, + ghs, gtq, + htg, + jmd, + pkr, usdt, usdc, } = convertCurrencyAmountValues(unit, value, unitsPerBtc, conversionOverride); @@ -867,7 +966,14 @@ export function mapCurrencyAmount( [CurrencyUnit.RWF]: rwf, [CurrencyUnit.ZMW]: zmw, [CurrencyUnit.AED]: aed, + [CurrencyUnit.BDT]: bdt, + [CurrencyUnit.COP]: cop, + [CurrencyUnit.EGP]: egp, + [CurrencyUnit.GHS]: ghs, [CurrencyUnit.GTQ]: gtq, + [CurrencyUnit.HTG]: htg, + [CurrencyUnit.JMD]: jmd, + [CurrencyUnit.PKR]: pkr, [CurrencyUnit.MICROBITCOIN]: mibtc, [CurrencyUnit.MILLIBITCOIN]: mlbtc, [CurrencyUnit.NANOBITCOIN]: nbtc, @@ -1007,10 +1113,38 @@ export function mapCurrencyAmount( value: aed, unit: CurrencyUnit.AED, }), + [CurrencyUnit.BDT]: formatCurrencyStr({ + value: bdt, + unit: CurrencyUnit.BDT, + }), + [CurrencyUnit.COP]: formatCurrencyStr({ + value: cop, + unit: CurrencyUnit.COP, + }), + [CurrencyUnit.EGP]: formatCurrencyStr({ + value: egp, + unit: CurrencyUnit.EGP, + }), + [CurrencyUnit.GHS]: formatCurrencyStr({ + value: ghs, + unit: CurrencyUnit.GHS, + }), [CurrencyUnit.GTQ]: formatCurrencyStr({ value: gtq, unit: CurrencyUnit.GTQ, }), + [CurrencyUnit.HTG]: formatCurrencyStr({ + value: htg, + unit: CurrencyUnit.HTG, + }), + [CurrencyUnit.JMD]: formatCurrencyStr({ + value: jmd, + unit: CurrencyUnit.JMD, + }), + [CurrencyUnit.PKR]: formatCurrencyStr({ + value: pkr, + unit: CurrencyUnit.PKR, + }), [CurrencyUnit.USDT]: formatCurrencyStr({ value: usdt, unit: CurrencyUnit.USDT, @@ -1145,8 +1279,22 @@ export const abbrCurrencyUnit = (unit: CurrencyUnitType) => { return "ZMW"; case CurrencyUnit.AED: return "AED"; + case CurrencyUnit.BDT: + return "BDT"; + case CurrencyUnit.COP: + return "COP"; + case CurrencyUnit.EGP: + return "EGP"; + case CurrencyUnit.GHS: + return "GHS"; case CurrencyUnit.GTQ: return "GTQ"; + case CurrencyUnit.HTG: + return "HTG"; + case CurrencyUnit.JMD: + return "JMD"; + case CurrencyUnit.PKR: + return "PKR"; } return "Unsupported CurrencyUnit"; }; @@ -1221,6 +1369,14 @@ export function formatCurrencyStr( CurrencyUnit.CAD, CurrencyUnit.DKK, CurrencyUnit.AED, + CurrencyUnit.BDT, + CurrencyUnit.COP, + CurrencyUnit.EGP, + CurrencyUnit.GHS, + CurrencyUnit.GTQ, + CurrencyUnit.HTG, + CurrencyUnit.JMD, + CurrencyUnit.PKR, CurrencyUnit.HKD, CurrencyUnit.SGD, ] as string[]; From 3a91962acbb8d5f39a2601b8b4b1568bdd3bdde0 Mon Sep 17 00:00:00 2001 From: Corey Martin Date: Wed, 18 Mar 2026 13:19:54 -0700 Subject: [PATCH 07/10] Migrate @lightsparkdev/origin design system into js/packages (#25076) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Migrates the [Origin Design System](https://github.com/lightsparkdev/origin) into the webdev monorepo as `js/packages/origin` - Adapts ESLint, TypeScript, and package scripts to monorepo conventions while preserving Origin's source-shipping build process - Fixes pre-existing bugs: Drawer API rename (`DrawerPreview` → `Drawer`), redundant type union, `querySelector` generic, Node 20 compatibility ## Details **Monorepo adaptations:** - ESLint → `@lightsparkdev/eslint-config/react-lib` with origin-specific rule relaxations for pre-existing type-safety warnings - TypeScript → extends `@lightsparkdev/tsconfig/base.json` with `bundler` moduleResolution (origin ships source TS, consumers use `transpilePackages`) - Scripts → standard monorepo names: `types`, `format`, `lint:fix`, `build:watch`, `package:checks`, etc. - Build → `yarn build:styles` (sass compilation only), preserving origin's source-shipping approach - Root `dependenciesMeta` → skips Central Icons build scripts (require `CENTRAL_LICENSE_KEY`; icons are already vendored) **Node 20 compatibility:** - Downgraded vitest `^4.0.17` → `^3.1.4` (v4 uses rolldown which requires Node >= 22) - Downgraded jsdom `^27.4.0` → `^25.0.1` (v27 has ESM compat issues with Node 20) **Local validation results:** - `types`: pass - `build`: pass - `format`: pass - `lint`: 0 errors, 28 warnings (pre-existing, demoted from errors) - `test`: 409/411 pass (2 analytics integration tests fail due to React 19 jsdom event dispatch) ## Test plan - [x] `yarn workspace @lightsparkdev/origin types` — passes - [x] `yarn workspace @lightsparkdev/origin build` — passes (sass compilation) - [x] `yarn workspace @lightsparkdev/origin lint` — 0 errors - [x] `yarn workspace @lightsparkdev/origin format` — passes - [x] `yarn workspace @lightsparkdev/origin test` — 409/411 pass - [ ] CI checks pass 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.6 (1M context) GitOrigin-RevId: 3123c9ccf6af5c32f0fe361f0f8b11e4dedb2f50 --- .mise.toml | 2 +- package.json | 11 + packages/origin/.gitignore | 25 + packages/origin/.npmignore | 4 + packages/origin/.storybook/main.ts | 12 + packages/origin/.storybook/preview.ts | 22 + packages/origin/.stylelintrc.json | 36 + packages/origin/CHANGELOG.md | 26 + packages/origin/CONTEXT.md | 308 + packages/origin/LICENSE | 201 + packages/origin/README.md | 176 + packages/origin/eslint.config.mjs | 40 + packages/origin/next.config.js | 10 + packages/origin/package.json | 113 + packages/origin/playwright-ct.config.ts | 45 + packages/origin/playwright/index.html | 13 + packages/origin/playwright/index.tsx | 2 + packages/origin/public/.gitkeep | 0 .../origin/public/fonts/SuisseIntl-Book.woff2 | Bin 0 -> 65220 bytes .../public/fonts/SuisseIntl-Medium.woff2 | Bin 0 -> 65944 bytes .../public/fonts/SuisseIntl-Regular.woff2 | Bin 0 -> 61844 bytes .../fonts/SuisseIntlMono-Regular-WebXL.woff2 | Bin 0 -> 17284 bytes packages/origin/scripts/build-tokens.js | 214 + .../origin/scripts/check-baseui-version.js | 61 + packages/origin/scripts/extract-icons.mjs | 505 ++ .../origin/scripts/patch-playwright-ct.js | 93 + packages/origin/skills/origin/SKILL.md | 198 + packages/origin/src/app/globals.scss | 1 + packages/origin/src/app/layout.tsx | 20 + packages/origin/src/app/page.tsx | 7170 +++++++++++++++++ .../Accordion/Accordion.module.scss | 91 + .../Accordion/Accordion.stories.tsx | 77 + .../Accordion/Accordion.test-stories.tsx | 94 + .../components/Accordion/Accordion.test.tsx | 165 + .../origin/src/components/Accordion/index.ts | 11 + .../origin/src/components/Accordion/parts.tsx | 100 + .../ActionBar/ActionBar.module.scss | 32 + .../ActionBar/ActionBar.stories.tsx | 92 + .../ActionBar/ActionBar.test-stories.tsx | 80 + .../components/ActionBar/ActionBar.test.tsx | 105 + .../src/components/ActionBar/ActionBar.tsx | 100 + .../origin/src/components/ActionBar/index.ts | 1 + .../src/components/Alert/Alert.module.scss | 93 + .../src/components/Alert/Alert.stories.tsx | 58 + .../components/Alert/Alert.test-stories.tsx | 60 + .../src/components/Alert/Alert.test.tsx | 86 + .../origin/src/components/Alert/Alert.tsx | 77 + packages/origin/src/components/Alert/index.ts | 1 + .../AlertDialog/AlertDialog.module.scss | 84 + .../AlertDialog/AlertDialog.stories.tsx | 108 + .../AlertDialog/AlertDialog.test-stories.tsx | 48 + .../AlertDialog/AlertDialog.test.tsx | 79 + .../src/components/AlertDialog/index.ts | 15 + .../src/components/AlertDialog/parts.tsx | 100 + .../Analytics.integration.unit.test.tsx | 99 + .../Analytics/Analytics.unit.test.tsx | 218 + .../components/Analytics/AnalyticsContext.tsx | 45 + .../origin/src/components/Analytics/index.ts | 7 + .../Analytics/useTrackedCallback.ts | 28 + .../Analytics/useTrackedOpenChange.ts | 47 + .../Autocomplete/Autocomplete.module.scss | 167 + .../Autocomplete/Autocomplete.stories.tsx | 395 + .../Autocomplete.test-stories.tsx | 266 + .../Autocomplete/Autocomplete.test.tsx | 217 + .../src/components/Autocomplete/index.ts | 17 + .../src/components/Autocomplete/parts.tsx | 280 + .../src/components/Avatar/Avatar.module.scss | 171 + .../src/components/Avatar/Avatar.stories.tsx | 169 + .../components/Avatar/Avatar.test-stories.tsx | 131 + .../src/components/Avatar/Avatar.test.tsx | 88 + .../origin/src/components/Avatar/Avatar.tsx | 114 + .../origin/src/components/Avatar/index.ts | 12 + .../src/components/Badge/Badge.module.scss | 92 + .../src/components/Badge/Badge.stories.tsx | 110 + .../components/Badge/Badge.test-stories.tsx | 77 + .../src/components/Badge/Badge.test.tsx | 84 + .../origin/src/components/Badge/Badge.tsx | 61 + packages/origin/src/components/Badge/index.ts | 1 + .../Breadcrumb/Breadcrumb.module.scss | 90 + .../Breadcrumb/Breadcrumb.stories.tsx | 113 + .../Breadcrumb/Breadcrumb.test-stories.tsx | 173 + .../components/Breadcrumb/Breadcrumb.test.tsx | 158 + .../Breadcrumb/Breadcrumb.unit.test.tsx | 250 + .../origin/src/components/Breadcrumb/index.ts | 37 + .../src/components/Breadcrumb/parts.tsx | 236 + .../src/components/Button/Button.module.scss | 292 + .../src/components/Button/Button.stories.tsx | 248 + .../components/Button/Button.test-stories.tsx | 129 + .../src/components/Button/Button.test.tsx | 304 + .../origin/src/components/Button/Button.tsx | 87 + .../origin/src/components/Button/index.ts | 2 + .../ButtonGroup/ButtonGroup.module.scss | 130 + .../ButtonGroup/ButtonGroup.stories.tsx | 150 + .../ButtonGroup/ButtonGroup.test-stories.tsx | 130 + .../ButtonGroup/ButtonGroup.test.tsx | 401 + .../components/ButtonGroup/ButtonGroup.tsx | 48 + .../src/components/ButtonGroup/index.ts | 2 + .../src/components/Card/Card.module.scss | 117 + .../src/components/Card/Card.stories.tsx | 191 + .../src/components/Card/Card.test-stories.tsx | 143 + .../origin/src/components/Card/Card.test.tsx | 73 + packages/origin/src/components/Card/index.ts | 14 + packages/origin/src/components/Card/parts.tsx | 183 + .../origin/src/components/Chart/BarChart.tsx | 1050 +++ .../origin/src/components/Chart/BarList.tsx | 187 + .../src/components/Chart/Chart.module.scss | 914 +++ .../src/components/Chart/Chart.stories.tsx | 1323 +++ .../components/Chart/Chart.test-stories.tsx | 401 + .../src/components/Chart/Chart.test.tsx | 879 ++ .../src/components/Chart/Chart.unit.test.ts | 843 ++ .../src/components/Chart/ChartWrapper.tsx | 94 + .../src/components/Chart/ComposedChart.tsx | 774 ++ .../src/components/Chart/FunnelChart.tsx | 440 + .../src/components/Chart/GaugeChart.tsx | 160 + .../origin/src/components/Chart/LineChart.tsx | 1070 +++ .../origin/src/components/Chart/LiveChart.tsx | 740 ++ .../origin/src/components/Chart/LiveDot.tsx | 53 + .../origin/src/components/Chart/LiveValue.tsx | 99 + .../origin/src/components/Chart/PieChart.tsx | 405 + .../src/components/Chart/SankeyChart.tsx | 621 ++ .../src/components/Chart/ScatterChart.tsx | 815 ++ .../origin/src/components/Chart/Sparkline.tsx | 116 + .../src/components/Chart/SplitChart.tsx | 259 + .../src/components/Chart/StackedAreaChart.tsx | 647 ++ .../src/components/Chart/UptimeChart.tsx | 231 + .../src/components/Chart/WaterfallChart.tsx | 594 ++ packages/origin/src/components/Chart/hooks.ts | 319 + packages/origin/src/components/Chart/index.ts | 67 + .../src/components/Chart/sankeyLayout.ts | 304 + packages/origin/src/components/Chart/types.ts | 129 + .../src/components/Chart/useMergedRef.ts | 17 + packages/origin/src/components/Chart/utils.ts | 362 + .../components/Checkbox/Checkbox.module.scss | 210 + .../components/Checkbox/Checkbox.stories.tsx | 257 + .../Checkbox/Checkbox.test-stories.tsx | 167 + .../src/components/Checkbox/Checkbox.test.tsx | 162 + .../src/components/Checkbox/Checkbox.tsx | 342 + .../origin/src/components/Checkbox/index.ts | 15 + .../src/components/Chip/Chip.module.scss | 101 + .../src/components/Chip/Chip.stories.tsx | 108 + .../src/components/Chip/Chip.test-stories.tsx | 48 + .../origin/src/components/Chip/Chip.test.tsx | 120 + packages/origin/src/components/Chip/Chip.tsx | 187 + packages/origin/src/components/Chip/index.ts | 1 + .../Collapsible/Collapsible.module.scss | 80 + .../Collapsible/Collapsible.stories.tsx | 86 + .../Collapsible/Collapsible.test-stories.tsx | 59 + .../Collapsible/Collapsible.test.tsx | 139 + .../src/components/Collapsible/index.ts | 9 + .../src/components/Collapsible/parts.tsx | 87 + .../components/Combobox/Combobox.module.scss | 349 + .../components/Combobox/Combobox.stories.tsx | 238 + .../Combobox/Combobox.test-stories.tsx | 289 + .../src/components/Combobox/Combobox.test.tsx | 243 + .../origin/src/components/Combobox/index.ts | 26 + .../origin/src/components/Combobox/parts.tsx | 639 ++ .../components/Command/Command.module.scss | 208 + .../components/Command/Command.stories.tsx | 424 + .../Command/Command.test-stories.tsx | 216 + .../src/components/Command/Command.test.tsx | 239 + .../origin/src/components/Command/index.ts | 23 + .../origin/src/components/Command/parts.tsx | 265 + .../ContextMenu/ContextMenu.stories.tsx | 301 + .../ContextMenu/ContextMenu.test-stories.tsx | 293 + .../ContextMenu/ContextMenu.test.tsx | 175 + .../src/components/ContextMenu/index.ts | 82 + .../src/components/ContextMenu/parts.tsx | 333 + .../DatePicker/DatePicker.module.scss | 198 + .../DatePicker/DatePicker.stories.tsx | 261 + .../DatePicker/DatePicker.test-stories.tsx | 569 ++ .../components/DatePicker/DatePicker.test.tsx | 883 ++ .../origin/src/components/DatePicker/index.ts | 19 + .../src/components/DatePicker/parts.tsx | 1295 +++ .../src/components/Dialog/Dialog.module.scss | 154 + .../src/components/Dialog/Dialog.stories.tsx | 227 + .../components/Dialog/Dialog.test-stories.tsx | 94 + .../src/components/Dialog/Dialog.test.tsx | 160 + .../origin/src/components/Dialog/index.ts | 21 + .../origin/src/components/Dialog/parts.tsx | 153 + .../src/components/Drawer/Drawer.module.scss | 449 ++ .../src/components/Drawer/Drawer.stories.tsx | 1568 ++++ .../components/Drawer/Drawer.test-stories.tsx | 388 + .../src/components/Drawer/Drawer.test.tsx | 533 ++ .../origin/src/components/Drawer/index.ts | 74 + .../origin/src/components/Drawer/parts.tsx | 223 + .../src/components/Field/Field.module.scss | 34 + .../src/components/Field/Field.stories.tsx | 132 + .../components/Field/Field.test-stories.tsx | 106 + .../src/components/Field/Field.test.tsx | 198 + packages/origin/src/components/Field/index.ts | 14 + .../origin/src/components/Field/parts.tsx | 104 + .../components/Fieldset/Fieldset.module.scss | 65 + .../components/Fieldset/Fieldset.stories.tsx | 72 + .../Fieldset/Fieldset.test-stories.tsx | 141 + .../src/components/Fieldset/Fieldset.test.tsx | 114 + .../origin/src/components/Fieldset/index.ts | 9 + .../origin/src/components/Fieldset/parts.tsx | 117 + .../src/components/Form/Form.module.scss | 6 + .../src/components/Form/Form.stories.tsx | 110 + .../src/components/Form/Form.test-stories.tsx | 89 + .../origin/src/components/Form/Form.test.tsx | 36 + packages/origin/src/components/Form/Form.tsx | 38 + packages/origin/src/components/Form/index.ts | 1 + .../src/components/Icon/CentralIcon.tsx | 56 + .../src/components/Icon/Icon.stories.tsx | 78 + .../src/components/Icon/Icon.unit.test.ts | 74 + .../src/components/Icon/icon-registry.ts | 493 ++ .../Icon/icons/CentralIconBase/index.d.ts | 11 + .../Icon/icons/CentralIconBase/index.mjs | 27 + .../Icon/icons/IconAdjustPhoto/index.d.ts | 4 + .../Icon/icons/IconAdjustPhoto/index.mjs | 90 + .../Icon/icons/IconAgenticCoding/index.d.ts | 4 + .../Icon/icons/IconAgenticCoding/index.mjs | 73 + .../Icon/icons/IconAntigravity/index.d.ts | 4 + .../Icon/icons/IconAntigravity/index.mjs | 38 + .../Icon/icons/IconApple/index.d.ts | 4 + .../components/Icon/icons/IconApple/index.mjs | 38 + .../Icon/icons/IconArrow/index.d.ts | 4 + .../components/Icon/icons/IconArrow/index.mjs | 68 + .../Icon/icons/IconArrowBoxRight/index.d.ts | 4 + .../Icon/icons/IconArrowBoxRight/index.mjs | 41 + .../Icon/icons/IconArrowDown/index.d.ts | 4 + .../Icon/icons/IconArrowDown/index.mjs | 48 + .../Icon/icons/IconArrowDownLeft/index.d.ts | 4 + .../Icon/icons/IconArrowDownLeft/index.mjs | 48 + .../Icon/icons/IconArrowDownRight/index.d.ts | 4 + .../Icon/icons/IconArrowDownRight/index.mjs | 48 + .../Icon/icons/IconArrowDownSquare/index.d.ts | 4 + .../Icon/icons/IconArrowDownSquare/index.mjs | 54 + .../Icon/icons/IconArrowDownWall/index.d.ts | 4 + .../Icon/icons/IconArrowDownWall/index.mjs | 54 + .../Icon/icons/IconArrowInbox/index.d.ts | 4 + .../Icon/icons/IconArrowInbox/index.mjs | 41 + .../Icon/icons/IconArrowLeft/index.d.ts | 4 + .../Icon/icons/IconArrowLeft/index.mjs | 48 + .../Icon/icons/IconArrowLeftSquare/index.d.ts | 4 + .../Icon/icons/IconArrowLeftSquare/index.mjs | 54 + .../icons/IconArrowLoopDownLeft/index.d.ts | 4 + .../icons/IconArrowLoopDownLeft/index.mjs | 48 + .../Icon/icons/IconArrowOutOfBox/index.d.ts | 4 + .../Icon/icons/IconArrowOutOfBox/index.mjs | 41 + .../Icon/icons/IconArrowRight/index.d.ts | 4 + .../Icon/icons/IconArrowRight/index.mjs | 48 + .../icons/IconArrowRightSquare/index.d.ts | 4 + .../Icon/icons/IconArrowRightSquare/index.mjs | 54 + .../Icon/icons/IconArrowUp/index.d.ts | 4 + .../Icon/icons/IconArrowUp/index.mjs | 48 + .../Icon/icons/IconArrowUpLeft/index.d.ts | 4 + .../Icon/icons/IconArrowUpLeft/index.mjs | 48 + .../Icon/icons/IconArrowUpRight/index.d.ts | 4 + .../Icon/icons/IconArrowUpRight/index.mjs | 41 + .../Icon/icons/IconArrowUpSquare/index.d.ts | 4 + .../Icon/icons/IconArrowUpSquare/index.mjs | 54 + .../Icon/icons/IconArrowUpWall/index.d.ts | 4 + .../Icon/icons/IconArrowUpWall/index.mjs | 55 + .../Icon/icons/IconArrowsRepeat/index.d.ts | 4 + .../Icon/icons/IconArrowsRepeat/index.mjs | 62 + .../icons/IconArrowsRepeatCircle/index.d.ts | 4 + .../icons/IconArrowsRepeatCircle/index.mjs | 60 + .../components/Icon/icons/IconAt/index.d.ts | 4 + .../components/Icon/icons/IconAt/index.mjs | 40 + .../Icon/icons/IconAutoCrop/index.d.ts | 4 + .../Icon/icons/IconAutoCrop/index.mjs | 56 + .../components/Icon/icons/IconBank/index.d.ts | 4 + .../components/Icon/icons/IconBank/index.mjs | 76 + .../Icon/icons/IconBarsThree2/index.d.ts | 4 + .../Icon/icons/IconBarsThree2/index.mjs | 41 + .../components/Icon/icons/IconBell/index.d.ts | 4 + .../components/Icon/icons/IconBell/index.mjs | 48 + .../Icon/icons/IconBellOff/index.d.ts | 4 + .../Icon/icons/IconBellOff/index.mjs | 61 + .../Icon/icons/IconBitcoinLogo/index.d.ts | 4 + .../Icon/icons/IconBitcoinLogo/index.mjs | 48 + .../Icon/icons/IconBlackpoint/index.d.ts | 4 + .../Icon/icons/IconBlackpoint/index.mjs | 53 + .../Icon/icons/IconBrackets1/index.d.ts | 4 + .../Icon/icons/IconBrackets1/index.mjs | 41 + .../Icon/icons/IconBrokenHeart/index.d.ts | 4 + .../Icon/icons/IconBrokenHeart/index.mjs | 41 + .../Icon/icons/IconBrowserTabs/index.d.ts | 4 + .../Icon/icons/IconBrowserTabs/index.mjs | 62 + .../Icon/icons/IconBubble3/index.d.ts | 4 + .../Icon/icons/IconBubble3/index.mjs | 41 + .../icons/IconBubbleWideSparkle/index.d.ts | 4 + .../icons/IconBubbleWideSparkle/index.mjs | 45 + .../Icon/icons/IconBuildings/index.d.ts | 4 + .../Icon/icons/IconBuildings/index.mjs | 69 + .../Icon/icons/IconCalendarDays/index.d.ts | 4 + .../Icon/icons/IconCalendarDays/index.mjs | 76 + .../Icon/icons/IconCheckmark2/index.d.ts | 4 + .../Icon/icons/IconCheckmark2/index.mjs | 41 + .../Icon/icons/IconCheckmark2Small/index.d.ts | 4 + .../Icon/icons/IconCheckmark2Small/index.mjs | 41 + .../Icon/icons/IconChevronBottom/index.d.ts | 4 + .../Icon/icons/IconChevronBottom/index.mjs | 41 + .../icons/IconChevronDownSmall/index.d.ts | 4 + .../Icon/icons/IconChevronDownSmall/index.mjs | 41 + .../IconChevronGrabberVertical/index.d.ts | 4 + .../IconChevronGrabberVertical/index.mjs | 48 + .../Icon/icons/IconChevronLeft/index.d.ts | 4 + .../Icon/icons/IconChevronLeft/index.mjs | 41 + .../icons/IconChevronLeftSmall/index.d.ts | 4 + .../Icon/icons/IconChevronLeftSmall/index.mjs | 41 + .../Icon/icons/IconChevronRight/index.d.ts | 4 + .../Icon/icons/IconChevronRight/index.mjs | 41 + .../icons/IconChevronRightSmall/index.d.ts | 4 + .../icons/IconChevronRightSmall/index.mjs | 41 + .../Icon/icons/IconChevronTop/index.d.ts | 4 + .../Icon/icons/IconChevronTop/index.mjs | 41 + .../Icon/icons/IconChevronTopSmall/index.d.ts | 4 + .../Icon/icons/IconChevronTopSmall/index.mjs | 41 + .../Icon/icons/IconCircleCheck/index.d.ts | 4 + .../Icon/icons/IconCircleCheck/index.mjs | 45 + .../icons/IconCircleCheckFilled/index.d.ts | 4 + .../icons/IconCircleCheckFilled/index.mjs | 44 + .../Icon/icons/IconCircleInfo/index.d.ts | 4 + .../Icon/icons/IconCircleInfo/index.mjs | 47 + .../icons/IconCircleInfoFilled/index.d.ts | 4 + .../Icon/icons/IconCircleInfoFilled/index.mjs | 40 + .../Icon/icons/IconCirclePlus/index.d.ts | 4 + .../Icon/icons/IconCirclePlus/index.mjs | 40 + .../icons/IconCircleQuestionmark/index.d.ts | 4 + .../icons/IconCircleQuestionmark/index.mjs | 55 + .../Icon/icons/IconCircleX/index.d.ts | 4 + .../Icon/icons/IconCircleX/index.mjs | 40 + .../Icon/icons/IconClaudeai/index.d.ts | 4 + .../Icon/icons/IconClaudeai/index.mjs | 38 + .../Icon/icons/IconClipboard2/index.d.ts | 4 + .../Icon/icons/IconClipboard2/index.mjs | 41 + .../icons/IconClipboard2Sparkle/index.d.ts | 4 + .../icons/IconClipboard2Sparkle/index.mjs | 55 + .../Icon/icons/IconClock/index.d.ts | 4 + .../components/Icon/icons/IconClock/index.mjs | 41 + .../Icon/icons/IconCmdBox/index.d.ts | 4 + .../Icon/icons/IconCmdBox/index.mjs | 38 + .../Icon/icons/IconCoinsAdd/index.d.ts | 4 + .../Icon/icons/IconCoinsAdd/index.mjs | 41 + .../Icon/icons/IconCoinsAddFilled/index.d.ts | 4 + .../Icon/icons/IconCoinsAddFilled/index.mjs | 44 + .../Icon/icons/IconConnectors1/index.d.ts | 4 + .../Icon/icons/IconConnectors1/index.mjs | 69 + .../Icon/icons/IconConnectors2/index.d.ts | 4 + .../Icon/icons/IconConnectors2/index.mjs | 61 + .../Icon/icons/IconConsoleSparkle/index.d.ts | 4 + .../Icon/icons/IconConsoleSparkle/index.mjs | 59 + .../Icon/icons/IconCrossLarge/index.d.ts | 4 + .../Icon/icons/IconCrossLarge/index.mjs | 40 + .../Icon/icons/IconCrossMedium/index.d.ts | 4 + .../Icon/icons/IconCrossMedium/index.mjs | 40 + .../Icon/icons/IconCrossSmall/index.d.ts | 4 + .../Icon/icons/IconCrossSmall/index.mjs | 40 + .../Icon/icons/IconCryptoWallet/index.d.ts | 4 + .../Icon/icons/IconCryptoWallet/index.mjs | 54 + .../Icon/icons/IconCursor/index.d.ts | 4 + .../Icon/icons/IconCursor/index.mjs | 38 + .../Icon/icons/IconDevices/index.d.ts | 4 + .../Icon/icons/IconDevices/index.mjs | 44 + .../Icon/icons/IconDiamondShine/index.d.ts | 4 + .../Icon/icons/IconDiamondShine/index.mjs | 69 + .../icons/IconDifferenceIgnored/index.d.ts | 4 + .../icons/IconDifferenceIgnored/index.mjs | 46 + .../icons/IconDifferenceModified/index.d.ts | 4 + .../icons/IconDifferenceModified/index.mjs | 46 + .../Icon/icons/IconDiscoBall/index.d.ts | 4 + .../Icon/icons/IconDiscoBall/index.mjs | 66 + .../icons/IconDotGrid1x3Horizontal/index.d.ts | 4 + .../icons/IconDotGrid1x3Horizontal/index.mjs | 67 + .../IconDotGrid1x3HorizontalTight/index.d.ts | 4 + .../IconDotGrid1x3HorizontalTight/index.mjs | 58 + .../icons/IconDotGrid1x3Vertical/index.d.ts | 4 + .../icons/IconDotGrid1x3Vertical/index.mjs | 67 + .../IconDotGrid1x3VerticalTight/index.d.ts | 4 + .../IconDotGrid1x3VerticalTight/index.mjs | 58 + .../Icon/icons/IconDotGrid2x3/index.d.ts | 4 + .../Icon/icons/IconDotGrid2x3/index.mjs | 58 + .../Icon/icons/IconDotGrid3x3/index.d.ts | 4 + .../Icon/icons/IconDotGrid3x3/index.mjs | 133 + .../Icon/icons/IconEuropeanUnion/index.d.ts | 4 + .../Icon/icons/IconEuropeanUnion/index.mjs | 82 + .../icons/IconExclamationTriangle/index.d.ts | 4 + .../icons/IconExclamationTriangle/index.mjs | 40 + .../IconExclamationTriangleFilled/index.d.ts | 4 + .../IconExclamationTriangleFilled/index.mjs | 40 + .../Icon/icons/IconEyeOpen/index.d.ts | 4 + .../Icon/icons/IconEyeOpen/index.mjs | 48 + .../Icon/icons/IconEyeSlash/index.d.ts | 4 + .../Icon/icons/IconEyeSlash/index.mjs | 62 + .../Icon/icons/IconEyeSlash2/index.d.ts | 4 + .../Icon/icons/IconEyeSlash2/index.mjs | 69 + .../Icon/icons/IconFileArrowLeftIn/index.d.ts | 4 + .../Icon/icons/IconFileArrowLeftIn/index.mjs | 65 + .../icons/IconFileArrowLeftOut/index.d.ts | 4 + .../Icon/icons/IconFileArrowLeftOut/index.mjs | 65 + .../icons/IconFileArrowRightOut/index.d.ts | 4 + .../icons/IconFileArrowRightOut/index.mjs | 65 + .../Icon/icons/IconFileBend/index.d.ts | 4 + .../Icon/icons/IconFileBend/index.mjs | 47 + .../Icon/icons/IconFilter2/index.d.ts | 4 + .../Icon/icons/IconFilter2/index.mjs | 52 + .../Icon/icons/IconFingerPrint1/index.d.ts | 4 + .../Icon/icons/IconFingerPrint1/index.mjs | 41 + .../Icon/icons/IconFolderAddRight/index.d.ts | 4 + .../Icon/icons/IconFolderAddRight/index.mjs | 55 + .../Icon/icons/IconForYou/index.d.ts | 4 + .../Icon/icons/IconForYou/index.mjs | 55 + .../Icon/icons/IconFormPyramide/index.d.ts | 4 + .../Icon/icons/IconFormPyramide/index.mjs | 48 + .../Icon/icons/IconFullScreen/index.d.ts | 4 + .../Icon/icons/IconFullScreen/index.mjs | 41 + .../Icon/icons/IconGemini/index.d.ts | 4 + .../Icon/icons/IconGemini/index.mjs | 38 + .../Icon/icons/IconGithub/index.d.ts | 4 + .../Icon/icons/IconGithub/index.mjs | 38 + .../Icon/icons/IconGlobe2/index.d.ts | 4 + .../Icon/icons/IconGlobe2/index.mjs | 59 + .../components/Icon/icons/IconGrok/index.d.ts | 4 + .../components/Icon/icons/IconGrok/index.mjs | 55 + .../Icon/icons/IconHeart2/index.d.ts | 4 + .../Icon/icons/IconHeart2/index.mjs | 40 + .../Icon/icons/IconHeart2Filled/index.d.ts | 4 + .../Icon/icons/IconHeart2Filled/index.mjs | 38 + .../components/Icon/icons/IconHome/index.d.ts | 4 + .../components/Icon/icons/IconHome/index.mjs | 40 + .../Icon/icons/IconImagineAi/index.d.ts | 4 + .../Icon/icons/IconImagineAi/index.mjs | 80 + .../Icon/icons/IconImport2/index.d.ts | 4 + .../Icon/icons/IconImport2/index.mjs | 48 + .../Icon/icons/IconInitiatives/index.d.ts | 4 + .../Icon/icons/IconInitiatives/index.mjs | 48 + .../Icon/icons/IconInvite/index.d.ts | 4 + .../Icon/icons/IconInvite/index.mjs | 41 + .../Icon/icons/IconIsoOrg/index.d.ts | 4 + .../Icon/icons/IconIsoOrg/index.mjs | 60 + .../components/Icon/icons/IconKey2/index.d.ts | 4 + .../components/Icon/icons/IconKey2/index.mjs | 47 + .../Icon/icons/IconLayoutColumn/index.d.ts | 4 + .../Icon/icons/IconLayoutColumn/index.mjs | 42 + .../Icon/icons/IconLayoutLeft/index.d.ts | 4 + .../Icon/icons/IconLayoutLeft/index.mjs | 42 + .../Icon/icons/IconLayoutRight/index.d.ts | 4 + .../Icon/icons/IconLayoutRight/index.mjs | 42 + .../Icon/icons/IconLinear/index.d.ts | 4 + .../Icon/icons/IconLinear/index.mjs | 38 + .../Icon/icons/IconLinkedin/index.d.ts | 4 + .../Icon/icons/IconLinkedin/index.mjs | 38 + .../Icon/icons/IconListSparkle/index.d.ts | 4 + .../Icon/icons/IconListSparkle/index.mjs | 41 + .../Icon/icons/IconLiveActivity/index.d.ts | 4 + .../Icon/icons/IconLiveActivity/index.mjs | 55 + .../Icon/icons/IconLiveFull/index.d.ts | 4 + .../Icon/icons/IconLiveFull/index.mjs | 41 + .../Icon/icons/IconLoader/index.d.ts | 4 + .../Icon/icons/IconLoader/index.mjs | 41 + .../components/Icon/icons/IconLock/index.d.ts | 4 + .../components/Icon/icons/IconLock/index.mjs | 48 + .../icons/IconMagnifyingGlass2/index.d.ts | 4 + .../Icon/icons/IconMagnifyingGlass2/index.mjs | 41 + .../Icon/icons/IconMinusLarge/index.d.ts | 4 + .../Icon/icons/IconMinusLarge/index.mjs | 40 + .../Icon/icons/IconMinusSmall/index.d.ts | 4 + .../Icon/icons/IconMinusSmall/index.mjs | 40 + .../components/Icon/icons/IconMoon/index.d.ts | 4 + .../components/Icon/icons/IconMoon/index.mjs | 38 + .../Icon/icons/IconMouse/index.d.ts | 4 + .../components/Icon/icons/IconMouse/index.mjs | 41 + .../Icon/icons/IconNotion/index.d.ts | 4 + .../Icon/icons/IconNotion/index.mjs | 38 + .../Icon/icons/IconOffline/index.d.ts | 4 + .../Icon/icons/IconOffline/index.mjs | 43 + .../Icon/icons/IconOngoing/index.d.ts | 4 + .../Icon/icons/IconOngoing/index.mjs | 76 + .../Icon/icons/IconOngoingFilled/index.d.ts | 4 + .../Icon/icons/IconOngoingFilled/index.mjs | 40 + .../Icon/icons/IconOpenai/index.d.ts | 4 + .../Icon/icons/IconOpenai/index.mjs | 38 + .../icons/IconPaperPlaneTopRight/index.d.ts | 4 + .../icons/IconPaperPlaneTopRight/index.mjs | 41 + .../IconPaperPlaneTopRightFilled/index.d.ts | 4 + .../IconPaperPlaneTopRightFilled/index.mjs | 38 + .../Icon/icons/IconPaperclip1/index.d.ts | 4 + .../Icon/icons/IconPaperclip1/index.mjs | 40 + .../Icon/icons/IconPassport/index.d.ts | 4 + .../Icon/icons/IconPassport/index.mjs | 41 + .../Icon/icons/IconPassword/index.d.ts | 4 + .../Icon/icons/IconPassword/index.mjs | 60 + .../Icon/icons/IconPasswordStars/index.d.ts | 4 + .../Icon/icons/IconPasswordStars/index.mjs | 58 + .../Icon/icons/IconPencil/index.d.ts | 4 + .../Icon/icons/IconPencil/index.mjs | 48 + .../Icon/icons/IconPencil2/index.d.ts | 4 + .../Icon/icons/IconPencil2/index.mjs | 46 + .../Icon/icons/IconPencil3/index.d.ts | 4 + .../Icon/icons/IconPencil3/index.mjs | 47 + .../Icon/icons/IconPencilAi/index.d.ts | 4 + .../Icon/icons/IconPencilAi/index.mjs | 54 + .../Icon/icons/IconPeople/index.d.ts | 4 + .../Icon/icons/IconPeople/index.mjs | 46 + .../Icon/icons/IconPeople2/index.d.ts | 4 + .../Icon/icons/IconPeople2/index.mjs | 48 + .../Icon/icons/IconPeople2Filled/index.d.ts | 4 + .../Icon/icons/IconPeople2Filled/index.mjs | 46 + .../Icon/icons/IconPeopleAdd/index.d.ts | 4 + .../Icon/icons/IconPeopleAdd/index.mjs | 55 + .../Icon/icons/IconPeopleAddFilled/index.d.ts | 4 + .../Icon/icons/IconPeopleAddFilled/index.mjs | 46 + .../Icon/icons/IconPeopleCircle/index.d.ts | 4 + .../Icon/icons/IconPeopleCircle/index.mjs | 46 + .../Icon/icons/IconPeopleIdCard/index.d.ts | 4 + .../Icon/icons/IconPeopleIdCard/index.mjs | 64 + .../Icon/icons/IconPhone/index.d.ts | 4 + .../components/Icon/icons/IconPhone/index.mjs | 41 + .../icons/IconPhoneDynamicIsland/index.d.ts | 4 + .../icons/IconPhoneDynamicIsland/index.mjs | 41 + .../Icon/icons/IconPlusLarge/index.d.ts | 4 + .../Icon/icons/IconPlusLarge/index.mjs | 41 + .../Icon/icons/IconPlusSmall/index.d.ts | 4 + .../Icon/icons/IconPlusSmall/index.mjs | 40 + .../Icon/icons/IconPrompt/index.d.ts | 4 + .../Icon/icons/IconPrompt/index.mjs | 76 + .../Icon/icons/IconRandom/index.d.ts | 4 + .../Icon/icons/IconRandom/index.mjs | 69 + .../Icon/icons/IconRedirectArrow/index.d.ts | 4 + .../Icon/icons/IconRedirectArrow/index.mjs | 48 + .../Icon/icons/IconRemix/index.d.ts | 4 + .../components/Icon/icons/IconRemix/index.mjs | 76 + .../Icon/icons/IconRemoveKeyframe/index.d.ts | 4 + .../Icon/icons/IconRemoveKeyframe/index.mjs | 47 + .../Icon/icons/IconRepeat/index.d.ts | 4 + .../Icon/icons/IconRepeat/index.mjs | 41 + .../Icon/icons/IconRescueRing/index.d.ts | 4 + .../Icon/icons/IconRescueRing/index.mjs | 64 + .../Icon/icons/IconRotate360Left/index.d.ts | 4 + .../Icon/icons/IconRotate360Left/index.mjs | 47 + .../Icon/icons/IconRotate360Right/index.d.ts | 4 + .../Icon/icons/IconRotate360Right/index.mjs | 47 + .../Icon/icons/IconRunShortcut/index.d.ts | 4 + .../Icon/icons/IconRunShortcut/index.mjs | 41 + .../Icon/icons/IconScanCode/index.d.ts | 4 + .../Icon/icons/IconScanCode/index.mjs | 67 + .../icons/IconSearchIntelligence/index.d.ts | 4 + .../icons/IconSearchIntelligence/index.mjs | 45 + .../icons/IconSearchlinesSparkle/index.d.ts | 4 + .../icons/IconSearchlinesSparkle/index.mjs | 56 + .../Icon/icons/IconSecretPhrase/index.d.ts | 4 + .../Icon/icons/IconSecretPhrase/index.mjs | 83 + .../Icon/icons/IconSettingsGear1/index.d.ts | 4 + .../Icon/icons/IconSettingsGear1/index.mjs | 46 + .../Icon/icons/IconSettingsGear2/index.d.ts | 4 + .../Icon/icons/IconSettingsGear2/index.mjs | 46 + .../Icon/icons/IconShield/index.d.ts | 4 + .../Icon/icons/IconShield/index.mjs | 41 + .../Icon/icons/IconShield2/index.d.ts | 4 + .../Icon/icons/IconShield2/index.mjs | 41 + .../Icon/icons/IconShieldKeyhole/index.d.ts | 4 + .../Icon/icons/IconShieldKeyhole/index.mjs | 41 + .../IconSidebarSimpleLeftWide/index.d.ts | 4 + .../icons/IconSidebarSimpleLeftWide/index.mjs | 46 + .../Icon/icons/IconSlack/index.d.ts | 4 + .../components/Icon/icons/IconSlack/index.mjs | 50 + .../Icon/icons/IconSpacebar/index.d.ts | 4 + .../Icon/icons/IconSpacebar/index.mjs | 41 + .../icons/IconSquareArrowTopRight2/index.d.ts | 4 + .../icons/IconSquareArrowTopRight2/index.mjs | 52 + .../icons/IconSquareBehindSquare1/index.d.ts | 4 + .../icons/IconSquareBehindSquare1/index.mjs | 41 + .../icons/IconSquareBehindSquare6/index.d.ts | 4 + .../icons/IconSquareBehindSquare6/index.mjs | 41 + .../Icon/icons/IconSquareInfo/index.d.ts | 4 + .../Icon/icons/IconSquareInfo/index.mjs | 44 + .../Icon/icons/IconSquarePlus/index.d.ts | 4 + .../Icon/icons/IconSquarePlus/index.mjs | 38 + .../Icon/icons/IconSticker/index.d.ts | 4 + .../Icon/icons/IconSticker/index.mjs | 51 + .../components/Icon/icons/IconStop/index.d.ts | 4 + .../components/Icon/icons/IconStop/index.mjs | 41 + .../Icon/icons/IconStopCircle/index.d.ts | 4 + .../Icon/icons/IconStopCircle/index.mjs | 44 + .../components/Icon/icons/IconSun/index.d.ts | 4 + .../components/Icon/icons/IconSun/index.mjs | 70 + .../Icon/icons/IconSupabase/index.d.ts | 4 + .../Icon/icons/IconSupabase/index.mjs | 42 + .../components/Icon/icons/IconTag/index.d.ts | 4 + .../components/Icon/icons/IconTag/index.mjs | 46 + .../Icon/icons/IconTarget/index.d.ts | 4 + .../Icon/icons/IconTarget/index.mjs | 52 + .../Icon/icons/IconTelescope/index.d.ts | 4 + .../Icon/icons/IconTelescope/index.mjs | 66 + .../Icon/icons/IconTextToSpeach/index.d.ts | 4 + .../Icon/icons/IconTextToSpeach/index.mjs | 69 + .../Icon/icons/IconTextareaDrag/index.d.ts | 4 + .../Icon/icons/IconTextareaDrag/index.mjs | 46 + .../Icon/icons/IconThumbDownCurved/index.d.ts | 4 + .../Icon/icons/IconThumbDownCurved/index.mjs | 46 + .../Icon/icons/IconThumbUpCurved/index.d.ts | 4 + .../Icon/icons/IconThumbUpCurved/index.mjs | 46 + .../Icon/icons/IconTimeFlies/index.d.ts | 4 + .../Icon/icons/IconTimeFlies/index.mjs | 57 + .../Icon/icons/IconTimeslot/index.d.ts | 4 + .../Icon/icons/IconTimeslot/index.mjs | 60 + .../Icon/icons/IconToggle/index.d.ts | 4 + .../Icon/icons/IconToggle/index.mjs | 49 + .../Icon/icons/IconTrashCanSimple/index.d.ts | 4 + .../Icon/icons/IconTrashCanSimple/index.mjs | 55 + .../Icon/icons/IconTrashRounded/index.d.ts | 4 + .../Icon/icons/IconTrashRounded/index.mjs | 44 + .../Icon/icons/IconTwitter/index.d.ts | 4 + .../Icon/icons/IconTwitter/index.mjs | 38 + .../Icon/icons/IconUnblur/index.d.ts | 4 + .../Icon/icons/IconUnblur/index.mjs | 88 + .../components/Icon/icons/IconUsbC/index.d.ts | 4 + .../components/Icon/icons/IconUsbC/index.mjs | 41 + .../Icon/icons/IconUserAddRight/index.d.ts | 4 + .../Icon/icons/IconUserAddRight/index.mjs | 55 + .../Icon/icons/IconUserAdded/index.d.ts | 4 + .../Icon/icons/IconUserAdded/index.mjs | 57 + .../Icon/icons/IconUserBlock/index.d.ts | 4 + .../Icon/icons/IconUserBlock/index.mjs | 62 + .../Icon/icons/IconUserDuo/index.d.ts | 4 + .../Icon/icons/IconUserDuo/index.mjs | 66 + .../Icon/icons/IconUserEdit/index.d.ts | 4 + .../Icon/icons/IconUserEdit/index.mjs | 56 + .../Icon/icons/IconUserGroup/index.d.ts | 4 + .../Icon/icons/IconUserGroup/index.mjs | 82 + .../Icon/icons/IconUserRemove/index.d.ts | 4 + .../Icon/icons/IconUserRemove/index.mjs | 56 + .../Icon/icons/IconUserRemoveRight/index.d.ts | 4 + .../Icon/icons/IconUserRemoveRight/index.mjs | 54 + .../Icon/icons/IconUserSettings/index.d.ts | 4 + .../Icon/icons/IconUserSettings/index.mjs | 56 + .../components/Icon/icons/IconV0/index.d.ts | 4 + .../components/Icon/icons/IconV0/index.mjs | 40 + .../Icon/icons/IconVariables/index.d.ts | 4 + .../Icon/icons/IconVariables/index.mjs | 48 + .../Icon/icons/IconVercel/index.d.ts | 4 + .../Icon/icons/IconVercel/index.mjs | 38 + .../Icon/icons/IconVibeCoding2/index.d.ts | 4 + .../Icon/icons/IconVibeCoding2/index.mjs | 52 + .../icons/IconVisualIntelligence/index.d.ts | 4 + .../icons/IconVisualIntelligence/index.mjs | 59 + .../Icon/icons/IconVoiceHigh/index.d.ts | 4 + .../Icon/icons/IconVoiceHigh/index.mjs | 40 + .../Icon/icons/IconVoiceLow/index.d.ts | 4 + .../Icon/icons/IconVoiceLow/index.mjs | 64 + .../Icon/icons/IconVoiceMid/index.d.ts | 4 + .../Icon/icons/IconVoiceMid/index.mjs | 64 + .../Icon/icons/IconVoiceRecord/index.d.ts | 4 + .../Icon/icons/IconVoiceRecord/index.mjs | 56 + .../Icon/icons/IconVoiceSettings/index.d.ts | 4 + .../Icon/icons/IconVoiceSettings/index.mjs | 54 + .../Icon/icons/IconVoiceSparkle/index.d.ts | 4 + .../Icon/icons/IconVoiceSparkle/index.mjs | 68 + .../Icon/icons/IconWallet1/index.d.ts | 4 + .../Icon/icons/IconWallet1/index.mjs | 40 + .../Icon/icons/IconWallet3/index.d.ts | 4 + .../Icon/icons/IconWallet3/index.mjs | 48 + .../components/Icon/icons/IconWeb3/index.d.ts | 4 + .../components/Icon/icons/IconWeb3/index.mjs | 39 + .../Icon/icons/IconWindowSparkle/index.d.ts | 4 + .../Icon/icons/IconWindowSparkle/index.mjs | 52 + .../Icon/icons/IconWreathSimple/index.d.ts | 4 + .../Icon/icons/IconWreathSimple/index.mjs | 90 + packages/origin/src/components/Icon/index.ts | 2 + .../src/components/Input/Input.module.scss | 39 + .../src/components/Input/Input.stories.tsx | 168 + .../components/Input/Input.test-stories.tsx | 42 + .../src/components/Input/Input.test.tsx | 120 + .../origin/src/components/Input/Input.tsx | 28 + packages/origin/src/components/Input/index.ts | 1 + .../InputGroup/InputGroup.module.scss | 242 + .../InputGroup/InputGroup.stories.tsx | 522 ++ .../InputGroup/InputGroup.test-stories.tsx | 379 + .../components/InputGroup/InputGroup.test.tsx | 595 ++ .../origin/src/components/InputGroup/index.ts | 13 + .../src/components/InputGroup/parts.tsx | 277 + .../src/components/Item/Item.module.scss | 95 + .../src/components/Item/Item.stories.tsx | 94 + .../src/components/Item/Item.test-stories.tsx | 146 + .../origin/src/components/Item/Item.test.tsx | 137 + packages/origin/src/components/Item/Item.tsx | 106 + packages/origin/src/components/Item/index.ts | 2 + .../src/components/Loader/Loader.module.scss | 35 + .../src/components/Loader/Loader.stories.tsx | 34 + .../origin/src/components/Loader/Loader.tsx | 35 + .../origin/src/components/Loader/index.ts | 2 + .../src/components/Logo/Logo.module.scss | 5 + .../src/components/Logo/Logo.stories.tsx | 74 + .../src/components/Logo/Logo.test-stories.tsx | 59 + .../origin/src/components/Logo/Logo.test.tsx | 106 + packages/origin/src/components/Logo/Logo.tsx | 362 + packages/origin/src/components/Logo/index.ts | 1 + .../src/components/Menu/Menu.module.scss | 240 + .../src/components/Menu/Menu.stories.tsx | 292 + .../src/components/Menu/Menu.test-stories.tsx | 272 + .../origin/src/components/Menu/Menu.test.tsx | 233 + packages/origin/src/components/Menu/index.ts | 86 + packages/origin/src/components/Menu/parts.tsx | 362 + .../components/Menubar/Menubar.module.scss | 49 + .../components/Menubar/Menubar.stories.tsx | 253 + .../Menubar/Menubar.test-stories.tsx | 182 + .../src/components/Menubar/Menubar.test.tsx | 97 + .../origin/src/components/Menubar/index.ts | 11 + .../origin/src/components/Menubar/parts.tsx | 36 + .../src/components/Meter/Meter.module.scss | 43 + .../src/components/Meter/Meter.stories.tsx | 47 + .../components/Meter/Meter.test-stories.tsx | 86 + .../src/components/Meter/Meter.test.tsx | 88 + packages/origin/src/components/Meter/index.ts | 11 + .../origin/src/components/Meter/parts.tsx | 77 + .../NavigationMenu/NavigationMenu.module.scss | 467 ++ .../NavigationMenu/NavigationMenu.stories.tsx | 286 + .../NavigationMenu.test-stories.tsx | 321 + .../NavigationMenu/NavigationMenu.test.tsx | 211 + .../src/components/NavigationMenu/index.ts | 22 + .../src/components/NavigationMenu/parts.tsx | 453 ++ .../Pagination/Pagination.module.scss | 87 + .../Pagination/Pagination.stories.tsx | 114 + .../Pagination/Pagination.test-stories.tsx | 173 + .../components/Pagination/Pagination.test.tsx | 196 + .../src/components/Pagination/Pagination.tsx | 283 + .../origin/src/components/Pagination/index.ts | 9 + .../PhoneInput/PhoneInput.module.scss | 220 + .../PhoneInput/PhoneInput.stories.tsx | 249 + .../PhoneInput/PhoneInput.test-stories.tsx | 162 + .../components/PhoneInput/PhoneInput.test.tsx | 201 + .../origin/src/components/PhoneInput/index.ts | 17 + .../src/components/PhoneInput/parts.tsx | 316 + .../components/Popover/Popover.module.scss | 87 + .../components/Popover/Popover.stories.tsx | 175 + .../Popover/Popover.test-stories.tsx | 152 + .../src/components/Popover/Popover.test.tsx | 155 + .../origin/src/components/Popover/Popover.tsx | 177 + .../origin/src/components/Popover/index.ts | 1 + .../PreviewCard/PreviewCard.module.scss | 67 + .../PreviewCard/PreviewCard.stories.tsx | 100 + .../PreviewCard/PreviewCard.test-stories.tsx | 60 + .../PreviewCard/PreviewCard.test.tsx | 70 + .../src/components/PreviewCard/index.ts | 35 + .../src/components/PreviewCard/parts.tsx | 96 + .../components/Progress/Progress.module.scss | 63 + .../components/Progress/Progress.stories.tsx | 89 + .../Progress/Progress.test-stories.tsx | 80 + .../src/components/Progress/Progress.test.tsx | 82 + .../origin/src/components/Progress/index.ts | 11 + .../origin/src/components/Progress/parts.tsx | 77 + .../src/components/Radio/Radio.module.scss | 164 + .../src/components/Radio/Radio.stories.tsx | 173 + .../components/Radio/Radio.test-stories.tsx | 109 + .../src/components/Radio/Radio.test.tsx | 151 + .../origin/src/components/Radio/Radio.tsx | 224 + packages/origin/src/components/Radio/index.ts | 1 + .../SegmentedNav/SegmentedNav.module.scss | 82 + .../SegmentedNav/SegmentedNav.stories.tsx | 92 + .../SegmentedNav.test-stories.tsx | 250 + .../SegmentedNav/SegmentedNav.test.tsx | 238 + .../src/components/SegmentedNav/index.ts | 7 + .../src/components/SegmentedNav/parts.tsx | 75 + .../src/components/Select/Select.module.scss | 348 + .../src/components/Select/Select.stories.tsx | 361 + .../components/Select/Select.test-stories.tsx | 430 + .../src/components/Select/Select.test.tsx | 318 + .../origin/src/components/Select/index.ts | 25 + .../origin/src/components/Select/parts.tsx | 335 + .../Separator/Separator.module.scss | 34 + .../Separator/Separator.stories.tsx | 120 + .../Separator/Separator.test-stories.tsx | 113 + .../components/Separator/Separator.test.tsx | 84 + .../src/components/Separator/Separator.tsx | 46 + .../origin/src/components/Separator/index.ts | 2 + .../components/Shortcut/Shortcut.module.scss | 22 + .../components/Shortcut/Shortcut.stories.tsx | 67 + .../Shortcut/Shortcut.test-stories.tsx | 30 + .../src/components/Shortcut/Shortcut.test.tsx | 55 + .../src/components/Shortcut/Shortcut.tsx | 54 + .../origin/src/components/Shortcut/index.ts | 1 + .../components/Sidebar/Sidebar.module.scss | 529 ++ .../components/Sidebar/Sidebar.stories.tsx | 879 ++ .../components/Sidebar/Sidebar.unit.test.tsx | 721 ++ .../origin/src/components/Sidebar/index.ts | 98 + .../origin/src/components/Sidebar/parts.tsx | 786 ++ .../components/Skeleton/Skeleton.module.scss | 65 + .../components/Skeleton/Skeleton.stories.tsx | 195 + .../Skeleton/Skeleton.test-stories.tsx | 75 + .../src/components/Skeleton/Skeleton.test.tsx | 108 + .../src/components/Skeleton/Skeleton.tsx | 58 + .../origin/src/components/Skeleton/index.ts | 2 + .../src/components/Switch/Switch.module.scss | 72 + .../src/components/Switch/Switch.stories.tsx | 122 + .../components/Switch/Switch.test-stories.tsx | 51 + .../src/components/Switch/Switch.test.tsx | 152 + .../origin/src/components/Switch/Switch.tsx | 53 + .../origin/src/components/Switch/index.ts | 2 + .../src/components/Table/Table.module.scss | 303 + .../src/components/Table/Table.stories.tsx | 151 + .../components/Table/Table.test-stories.tsx | 1117 +++ .../src/components/Table/Table.test.tsx | 195 + .../src/components/Table/Table.unit.test.tsx | 169 + packages/origin/src/components/Table/index.ts | 29 + .../origin/src/components/Table/parts.tsx | 444 + .../src/components/Tabs/Tabs.module.scss | 111 + .../src/components/Tabs/Tabs.stories.tsx | 78 + .../src/components/Tabs/Tabs.test-stories.tsx | 91 + .../origin/src/components/Tabs/Tabs.test.tsx | 171 + packages/origin/src/components/Tabs/index.ts | 11 + packages/origin/src/components/Tabs/parts.tsx | 96 + .../components/Textarea/Textarea.module.scss | 69 + .../components/Textarea/Textarea.stories.tsx | 170 + .../Textarea/Textarea.test-stories.tsx | 46 + .../src/components/Textarea/Textarea.test.tsx | 315 + .../src/components/Textarea/Textarea.tsx | 180 + .../origin/src/components/Textarea/index.ts | 1 + .../TextareaGroup/TextareaGroup.module.scss | 83 + .../TextareaGroup/TextareaGroup.stories.tsx | 258 + .../TextareaGroup.test-stories.tsx | 214 + .../TextareaGroup/TextareaGroup.test.tsx | 327 + .../src/components/TextareaGroup/index.ts | 8 + .../src/components/TextareaGroup/parts.tsx | 153 + .../src/components/Toast/Toast.module.scss | 152 + .../src/components/Toast/Toast.stories.tsx | 139 + .../components/Toast/Toast.test-stories.tsx | 216 + .../src/components/Toast/Toast.test.tsx | 134 + packages/origin/src/components/Toast/index.ts | 17 + .../origin/src/components/Toast/parts.tsx | 181 + .../src/components/Toggle/Toggle.module.scss | 102 + .../src/components/Toggle/Toggle.stories.tsx | 43 + .../components/Toggle/Toggle.test-stories.tsx | 166 + .../src/components/Toggle/Toggle.test.tsx | 262 + .../origin/src/components/Toggle/Toggle.tsx | 74 + .../origin/src/components/Toggle/index.ts | 2 + .../components/Tooltip/Tooltip.module.scss | 70 + .../components/Tooltip/Tooltip.stories.tsx | 145 + .../Tooltip/Tooltip.test-stories.tsx | 165 + .../src/components/Tooltip/Tooltip.test.tsx | 119 + .../origin/src/components/Tooltip/Tooltip.tsx | 105 + .../origin/src/components/Tooltip/index.ts | 1 + .../VisuallyHidden/VisuallyHidden.stories.tsx | 52 + .../VisuallyHidden/VisuallyHidden.tsx | 69 + .../src/components/VisuallyHidden/index.ts | 2 + packages/origin/src/declarations.d.ts | 9 + packages/origin/src/index.ts | 231 + packages/origin/src/lib/base-ui-utils.ts | 185 + packages/origin/src/lib/dev-warn.ts | 18 + packages/origin/src/styles/public.scss | 33 + packages/origin/src/tokens/_effects.scss | 11 + packages/origin/src/tokens/_fonts.scss | 55 + packages/origin/src/tokens/_mixins.scss | 93 + packages/origin/src/tokens/_reset.scss | 71 + packages/origin/src/tokens/_text-styles.scss | 161 + packages/origin/src/tokens/_typography.scss | 73 + packages/origin/src/tokens/_utilities.scss | 6 + packages/origin/src/tokens/_variables.scss | 461 ++ .../origin/test-utils/describeConformance.tsx | 175 + .../test-utils/describeConformance.unit.ts | 184 + packages/origin/test-utils/index.ts | 20 + packages/origin/test-utils/setup.ts | 52 + .../tokens/figma/baseline/Value.tokens.json | 958 +++ .../tokens/figma/origin/Dark.tokens.json | 1631 ++++ .../tokens/figma/origin/Light.tokens.json | 1631 ++++ .../tokens/figma/origin/Value.tokens.json | 3285 ++++++++ packages/origin/tools/base-ui-lint/README.md | 82 + .../origin/tools/base-ui-lint/manifest.json | 13 + .../origin/tools/base-ui-lint/package.json | 15 + .../tools/base-ui-lint/rules/accordion.json | 41 + .../base-ui-lint/rules/alert-dialog.json | 45 + .../base-ui-lint/rules/autocomplete.json | 60 + .../tools/base-ui-lint/rules/avatar.json | 24 + .../tools/base-ui-lint/rules/button.json | 16 + .../base-ui-lint/rules/checkbox-group.json | 22 + .../tools/base-ui-lint/rules/checkbox.json | 20 + .../tools/base-ui-lint/rules/collapsible.json | 25 + .../tools/base-ui-lint/rules/combobox.json | 55 + .../base-ui-lint/rules/context-menu.json | 57 + .../tools/base-ui-lint/rules/dialog.json | 41 + .../tools/base-ui-lint/rules/field.json | 37 + .../tools/base-ui-lint/rules/fieldset.json | 21 + .../origin/tools/base-ui-lint/rules/form.json | 16 + .../tools/base-ui-lint/rules/input.json | 19 + .../origin/tools/base-ui-lint/rules/menu.json | 70 + .../tools/base-ui-lint/rules/menubar.json | 57 + .../tools/base-ui-lint/rules/meter.json | 24 + .../base-ui-lint/rules/navigation-menu.json | 52 + .../base-ui-lint/rules/number-field.json | 38 + .../tools/base-ui-lint/rules/popover.json | 43 + .../base-ui-lint/rules/preview-card.json | 43 + .../tools/base-ui-lint/rules/progress.json | 26 + .../tools/base-ui-lint/rules/radio-group.json | 26 + .../tools/base-ui-lint/rules/radio.json | 25 + .../tools/base-ui-lint/rules/scroll-area.json | 31 + .../tools/base-ui-lint/rules/select.json | 85 + .../tools/base-ui-lint/rules/separator.json | 13 + .../tools/base-ui-lint/rules/slider.json | 33 + .../tools/base-ui-lint/rules/switch.json | 21 + .../origin/tools/base-ui-lint/rules/tabs.json | 37 + .../tools/base-ui-lint/rules/textarea.json | 18 + .../tools/base-ui-lint/rules/toast.json | 35 + .../base-ui-lint/rules/toggle-group.json | 23 + .../tools/base-ui-lint/rules/toggle.json | 20 + .../tools/base-ui-lint/rules/toolbar.json | 38 + .../tools/base-ui-lint/rules/tooltip.json | 28 + .../origin/tools/base-ui-lint/src/code.ts | 106 + .../tools/base-ui-lint/src/lint-engine.ts | 268 + .../origin/tools/base-ui-lint/src/rules.ts | 142 + .../origin/tools/base-ui-lint/tsconfig.json | 16 + packages/origin/tools/base-ui-lint/ui.html | 294 + .../tools/figma-styles/fetch-node-css.ts | 230 + .../origin/tools/figma-styles/fetch-styles.ts | 248 + packages/origin/tools/figma-styles/utils.ts | 76 + packages/origin/tsconfig.json | 30 + packages/origin/vitest.config.ts | 32 + packages/ui/package.json | 2 +- 909 files changed, 98568 insertions(+), 2 deletions(-) create mode 100644 packages/origin/.gitignore create mode 100644 packages/origin/.npmignore create mode 100644 packages/origin/.storybook/main.ts create mode 100644 packages/origin/.storybook/preview.ts create mode 100644 packages/origin/.stylelintrc.json create mode 100644 packages/origin/CHANGELOG.md create mode 100644 packages/origin/CONTEXT.md create mode 100644 packages/origin/LICENSE create mode 100644 packages/origin/README.md create mode 100644 packages/origin/eslint.config.mjs create mode 100644 packages/origin/next.config.js create mode 100644 packages/origin/package.json create mode 100644 packages/origin/playwright-ct.config.ts create mode 100644 packages/origin/playwright/index.html create mode 100644 packages/origin/playwright/index.tsx create mode 100644 packages/origin/public/.gitkeep create mode 100644 packages/origin/public/fonts/SuisseIntl-Book.woff2 create mode 100644 packages/origin/public/fonts/SuisseIntl-Medium.woff2 create mode 100644 packages/origin/public/fonts/SuisseIntl-Regular.woff2 create mode 100644 packages/origin/public/fonts/SuisseIntlMono-Regular-WebXL.woff2 create mode 100644 packages/origin/scripts/build-tokens.js create mode 100644 packages/origin/scripts/check-baseui-version.js create mode 100644 packages/origin/scripts/extract-icons.mjs create mode 100644 packages/origin/scripts/patch-playwright-ct.js create mode 100644 packages/origin/skills/origin/SKILL.md create mode 100644 packages/origin/src/app/globals.scss create mode 100644 packages/origin/src/app/layout.tsx create mode 100644 packages/origin/src/app/page.tsx create mode 100644 packages/origin/src/components/Accordion/Accordion.module.scss create mode 100644 packages/origin/src/components/Accordion/Accordion.stories.tsx create mode 100644 packages/origin/src/components/Accordion/Accordion.test-stories.tsx create mode 100644 packages/origin/src/components/Accordion/Accordion.test.tsx create mode 100644 packages/origin/src/components/Accordion/index.ts create mode 100644 packages/origin/src/components/Accordion/parts.tsx create mode 100644 packages/origin/src/components/ActionBar/ActionBar.module.scss create mode 100644 packages/origin/src/components/ActionBar/ActionBar.stories.tsx create mode 100644 packages/origin/src/components/ActionBar/ActionBar.test-stories.tsx create mode 100644 packages/origin/src/components/ActionBar/ActionBar.test.tsx create mode 100644 packages/origin/src/components/ActionBar/ActionBar.tsx create mode 100644 packages/origin/src/components/ActionBar/index.ts create mode 100644 packages/origin/src/components/Alert/Alert.module.scss create mode 100644 packages/origin/src/components/Alert/Alert.stories.tsx create mode 100644 packages/origin/src/components/Alert/Alert.test-stories.tsx create mode 100644 packages/origin/src/components/Alert/Alert.test.tsx create mode 100644 packages/origin/src/components/Alert/Alert.tsx create mode 100644 packages/origin/src/components/Alert/index.ts create mode 100644 packages/origin/src/components/AlertDialog/AlertDialog.module.scss create mode 100644 packages/origin/src/components/AlertDialog/AlertDialog.stories.tsx create mode 100644 packages/origin/src/components/AlertDialog/AlertDialog.test-stories.tsx create mode 100644 packages/origin/src/components/AlertDialog/AlertDialog.test.tsx create mode 100644 packages/origin/src/components/AlertDialog/index.ts create mode 100644 packages/origin/src/components/AlertDialog/parts.tsx create mode 100644 packages/origin/src/components/Analytics/Analytics.integration.unit.test.tsx create mode 100644 packages/origin/src/components/Analytics/Analytics.unit.test.tsx create mode 100644 packages/origin/src/components/Analytics/AnalyticsContext.tsx create mode 100644 packages/origin/src/components/Analytics/index.ts create mode 100644 packages/origin/src/components/Analytics/useTrackedCallback.ts create mode 100644 packages/origin/src/components/Analytics/useTrackedOpenChange.ts create mode 100644 packages/origin/src/components/Autocomplete/Autocomplete.module.scss create mode 100644 packages/origin/src/components/Autocomplete/Autocomplete.stories.tsx create mode 100644 packages/origin/src/components/Autocomplete/Autocomplete.test-stories.tsx create mode 100644 packages/origin/src/components/Autocomplete/Autocomplete.test.tsx create mode 100644 packages/origin/src/components/Autocomplete/index.ts create mode 100644 packages/origin/src/components/Autocomplete/parts.tsx create mode 100644 packages/origin/src/components/Avatar/Avatar.module.scss create mode 100644 packages/origin/src/components/Avatar/Avatar.stories.tsx create mode 100644 packages/origin/src/components/Avatar/Avatar.test-stories.tsx create mode 100644 packages/origin/src/components/Avatar/Avatar.test.tsx create mode 100644 packages/origin/src/components/Avatar/Avatar.tsx create mode 100644 packages/origin/src/components/Avatar/index.ts create mode 100644 packages/origin/src/components/Badge/Badge.module.scss create mode 100644 packages/origin/src/components/Badge/Badge.stories.tsx create mode 100644 packages/origin/src/components/Badge/Badge.test-stories.tsx create mode 100644 packages/origin/src/components/Badge/Badge.test.tsx create mode 100644 packages/origin/src/components/Badge/Badge.tsx create mode 100644 packages/origin/src/components/Badge/index.ts create mode 100644 packages/origin/src/components/Breadcrumb/Breadcrumb.module.scss create mode 100644 packages/origin/src/components/Breadcrumb/Breadcrumb.stories.tsx create mode 100644 packages/origin/src/components/Breadcrumb/Breadcrumb.test-stories.tsx create mode 100644 packages/origin/src/components/Breadcrumb/Breadcrumb.test.tsx create mode 100644 packages/origin/src/components/Breadcrumb/Breadcrumb.unit.test.tsx create mode 100644 packages/origin/src/components/Breadcrumb/index.ts create mode 100644 packages/origin/src/components/Breadcrumb/parts.tsx create mode 100644 packages/origin/src/components/Button/Button.module.scss create mode 100644 packages/origin/src/components/Button/Button.stories.tsx create mode 100644 packages/origin/src/components/Button/Button.test-stories.tsx create mode 100644 packages/origin/src/components/Button/Button.test.tsx create mode 100644 packages/origin/src/components/Button/Button.tsx create mode 100644 packages/origin/src/components/Button/index.ts create mode 100644 packages/origin/src/components/ButtonGroup/ButtonGroup.module.scss create mode 100644 packages/origin/src/components/ButtonGroup/ButtonGroup.stories.tsx create mode 100644 packages/origin/src/components/ButtonGroup/ButtonGroup.test-stories.tsx create mode 100644 packages/origin/src/components/ButtonGroup/ButtonGroup.test.tsx create mode 100644 packages/origin/src/components/ButtonGroup/ButtonGroup.tsx create mode 100644 packages/origin/src/components/ButtonGroup/index.ts create mode 100644 packages/origin/src/components/Card/Card.module.scss create mode 100644 packages/origin/src/components/Card/Card.stories.tsx create mode 100644 packages/origin/src/components/Card/Card.test-stories.tsx create mode 100644 packages/origin/src/components/Card/Card.test.tsx create mode 100644 packages/origin/src/components/Card/index.ts create mode 100644 packages/origin/src/components/Card/parts.tsx create mode 100644 packages/origin/src/components/Chart/BarChart.tsx create mode 100644 packages/origin/src/components/Chart/BarList.tsx create mode 100644 packages/origin/src/components/Chart/Chart.module.scss create mode 100644 packages/origin/src/components/Chart/Chart.stories.tsx create mode 100644 packages/origin/src/components/Chart/Chart.test-stories.tsx create mode 100644 packages/origin/src/components/Chart/Chart.test.tsx create mode 100644 packages/origin/src/components/Chart/Chart.unit.test.ts create mode 100644 packages/origin/src/components/Chart/ChartWrapper.tsx create mode 100644 packages/origin/src/components/Chart/ComposedChart.tsx create mode 100644 packages/origin/src/components/Chart/FunnelChart.tsx create mode 100644 packages/origin/src/components/Chart/GaugeChart.tsx create mode 100644 packages/origin/src/components/Chart/LineChart.tsx create mode 100644 packages/origin/src/components/Chart/LiveChart.tsx create mode 100644 packages/origin/src/components/Chart/LiveDot.tsx create mode 100644 packages/origin/src/components/Chart/LiveValue.tsx create mode 100644 packages/origin/src/components/Chart/PieChart.tsx create mode 100644 packages/origin/src/components/Chart/SankeyChart.tsx create mode 100644 packages/origin/src/components/Chart/ScatterChart.tsx create mode 100644 packages/origin/src/components/Chart/Sparkline.tsx create mode 100644 packages/origin/src/components/Chart/SplitChart.tsx create mode 100644 packages/origin/src/components/Chart/StackedAreaChart.tsx create mode 100644 packages/origin/src/components/Chart/UptimeChart.tsx create mode 100644 packages/origin/src/components/Chart/WaterfallChart.tsx create mode 100644 packages/origin/src/components/Chart/hooks.ts create mode 100644 packages/origin/src/components/Chart/index.ts create mode 100644 packages/origin/src/components/Chart/sankeyLayout.ts create mode 100644 packages/origin/src/components/Chart/types.ts create mode 100644 packages/origin/src/components/Chart/useMergedRef.ts create mode 100644 packages/origin/src/components/Chart/utils.ts create mode 100644 packages/origin/src/components/Checkbox/Checkbox.module.scss create mode 100644 packages/origin/src/components/Checkbox/Checkbox.stories.tsx create mode 100644 packages/origin/src/components/Checkbox/Checkbox.test-stories.tsx create mode 100644 packages/origin/src/components/Checkbox/Checkbox.test.tsx create mode 100644 packages/origin/src/components/Checkbox/Checkbox.tsx create mode 100644 packages/origin/src/components/Checkbox/index.ts create mode 100644 packages/origin/src/components/Chip/Chip.module.scss create mode 100644 packages/origin/src/components/Chip/Chip.stories.tsx create mode 100644 packages/origin/src/components/Chip/Chip.test-stories.tsx create mode 100644 packages/origin/src/components/Chip/Chip.test.tsx create mode 100644 packages/origin/src/components/Chip/Chip.tsx create mode 100644 packages/origin/src/components/Chip/index.ts create mode 100644 packages/origin/src/components/Collapsible/Collapsible.module.scss create mode 100644 packages/origin/src/components/Collapsible/Collapsible.stories.tsx create mode 100644 packages/origin/src/components/Collapsible/Collapsible.test-stories.tsx create mode 100644 packages/origin/src/components/Collapsible/Collapsible.test.tsx create mode 100644 packages/origin/src/components/Collapsible/index.ts create mode 100644 packages/origin/src/components/Collapsible/parts.tsx create mode 100644 packages/origin/src/components/Combobox/Combobox.module.scss create mode 100644 packages/origin/src/components/Combobox/Combobox.stories.tsx create mode 100644 packages/origin/src/components/Combobox/Combobox.test-stories.tsx create mode 100644 packages/origin/src/components/Combobox/Combobox.test.tsx create mode 100644 packages/origin/src/components/Combobox/index.ts create mode 100644 packages/origin/src/components/Combobox/parts.tsx create mode 100644 packages/origin/src/components/Command/Command.module.scss create mode 100644 packages/origin/src/components/Command/Command.stories.tsx create mode 100644 packages/origin/src/components/Command/Command.test-stories.tsx create mode 100644 packages/origin/src/components/Command/Command.test.tsx create mode 100644 packages/origin/src/components/Command/index.ts create mode 100644 packages/origin/src/components/Command/parts.tsx create mode 100644 packages/origin/src/components/ContextMenu/ContextMenu.stories.tsx create mode 100644 packages/origin/src/components/ContextMenu/ContextMenu.test-stories.tsx create mode 100644 packages/origin/src/components/ContextMenu/ContextMenu.test.tsx create mode 100644 packages/origin/src/components/ContextMenu/index.ts create mode 100644 packages/origin/src/components/ContextMenu/parts.tsx create mode 100644 packages/origin/src/components/DatePicker/DatePicker.module.scss create mode 100644 packages/origin/src/components/DatePicker/DatePicker.stories.tsx create mode 100644 packages/origin/src/components/DatePicker/DatePicker.test-stories.tsx create mode 100644 packages/origin/src/components/DatePicker/DatePicker.test.tsx create mode 100644 packages/origin/src/components/DatePicker/index.ts create mode 100644 packages/origin/src/components/DatePicker/parts.tsx create mode 100644 packages/origin/src/components/Dialog/Dialog.module.scss create mode 100644 packages/origin/src/components/Dialog/Dialog.stories.tsx create mode 100644 packages/origin/src/components/Dialog/Dialog.test-stories.tsx create mode 100644 packages/origin/src/components/Dialog/Dialog.test.tsx create mode 100644 packages/origin/src/components/Dialog/index.ts create mode 100644 packages/origin/src/components/Dialog/parts.tsx create mode 100644 packages/origin/src/components/Drawer/Drawer.module.scss create mode 100644 packages/origin/src/components/Drawer/Drawer.stories.tsx create mode 100644 packages/origin/src/components/Drawer/Drawer.test-stories.tsx create mode 100644 packages/origin/src/components/Drawer/Drawer.test.tsx create mode 100644 packages/origin/src/components/Drawer/index.ts create mode 100644 packages/origin/src/components/Drawer/parts.tsx create mode 100644 packages/origin/src/components/Field/Field.module.scss create mode 100644 packages/origin/src/components/Field/Field.stories.tsx create mode 100644 packages/origin/src/components/Field/Field.test-stories.tsx create mode 100644 packages/origin/src/components/Field/Field.test.tsx create mode 100644 packages/origin/src/components/Field/index.ts create mode 100644 packages/origin/src/components/Field/parts.tsx create mode 100644 packages/origin/src/components/Fieldset/Fieldset.module.scss create mode 100644 packages/origin/src/components/Fieldset/Fieldset.stories.tsx create mode 100644 packages/origin/src/components/Fieldset/Fieldset.test-stories.tsx create mode 100644 packages/origin/src/components/Fieldset/Fieldset.test.tsx create mode 100644 packages/origin/src/components/Fieldset/index.ts create mode 100644 packages/origin/src/components/Fieldset/parts.tsx create mode 100644 packages/origin/src/components/Form/Form.module.scss create mode 100644 packages/origin/src/components/Form/Form.stories.tsx create mode 100644 packages/origin/src/components/Form/Form.test-stories.tsx create mode 100644 packages/origin/src/components/Form/Form.test.tsx create mode 100644 packages/origin/src/components/Form/Form.tsx create mode 100644 packages/origin/src/components/Form/index.ts create mode 100644 packages/origin/src/components/Icon/CentralIcon.tsx create mode 100644 packages/origin/src/components/Icon/Icon.stories.tsx create mode 100644 packages/origin/src/components/Icon/Icon.unit.test.ts create mode 100644 packages/origin/src/components/Icon/icon-registry.ts create mode 100644 packages/origin/src/components/Icon/icons/CentralIconBase/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/CentralIconBase/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconAdjustPhoto/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconAdjustPhoto/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconAgenticCoding/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconAgenticCoding/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconAntigravity/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconAntigravity/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconApple/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconApple/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrow/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrow/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowBoxRight/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowBoxRight/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowDown/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowDown/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowDownLeft/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowDownLeft/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowDownRight/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowDownRight/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowDownSquare/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowDownSquare/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowDownWall/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowDownWall/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowInbox/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowInbox/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowLeft/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowLeft/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowLeftSquare/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowLeftSquare/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowLoopDownLeft/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowLoopDownLeft/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowOutOfBox/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowOutOfBox/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowRight/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowRight/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowRightSquare/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowRightSquare/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowUp/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowUp/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowUpLeft/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowUpLeft/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowUpRight/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowUpRight/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowUpSquare/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowUpSquare/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowUpWall/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowUpWall/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowsRepeat/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowsRepeat/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconArrowsRepeatCircle/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconArrowsRepeatCircle/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconAt/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconAt/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconAutoCrop/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconAutoCrop/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconBank/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconBank/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconBarsThree2/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconBarsThree2/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconBell/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconBell/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconBellOff/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconBellOff/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconBitcoinLogo/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconBitcoinLogo/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconBlackpoint/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconBlackpoint/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconBrackets1/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconBrackets1/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconBrokenHeart/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconBrokenHeart/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconBrowserTabs/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconBrowserTabs/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconBubble3/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconBubble3/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconBubbleWideSparkle/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconBubbleWideSparkle/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconBuildings/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconBuildings/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCalendarDays/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCalendarDays/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCheckmark2/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCheckmark2/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCheckmark2Small/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCheckmark2Small/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconChevronBottom/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconChevronBottom/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconChevronDownSmall/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconChevronDownSmall/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconChevronGrabberVertical/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconChevronGrabberVertical/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconChevronLeft/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconChevronLeft/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconChevronLeftSmall/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconChevronLeftSmall/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconChevronRight/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconChevronRight/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconChevronRightSmall/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconChevronRightSmall/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconChevronTop/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconChevronTop/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconChevronTopSmall/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconChevronTopSmall/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCircleCheck/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCircleCheck/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCircleCheckFilled/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCircleCheckFilled/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCircleInfo/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCircleInfo/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCircleInfoFilled/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCircleInfoFilled/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCirclePlus/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCirclePlus/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCircleQuestionmark/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCircleQuestionmark/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCircleX/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCircleX/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconClaudeai/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconClaudeai/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconClipboard2/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconClipboard2/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconClipboard2Sparkle/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconClipboard2Sparkle/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconClock/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconClock/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCmdBox/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCmdBox/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCoinsAdd/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCoinsAdd/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCoinsAddFilled/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCoinsAddFilled/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconConnectors1/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconConnectors1/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconConnectors2/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconConnectors2/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconConsoleSparkle/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconConsoleSparkle/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCrossLarge/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCrossLarge/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCrossMedium/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCrossMedium/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCrossSmall/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCrossSmall/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCryptoWallet/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCryptoWallet/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconCursor/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconCursor/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconDevices/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconDevices/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconDiamondShine/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconDiamondShine/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconDifferenceIgnored/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconDifferenceIgnored/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconDifferenceModified/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconDifferenceModified/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconDiscoBall/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconDiscoBall/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconDotGrid1x3Horizontal/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconDotGrid1x3Horizontal/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconDotGrid1x3HorizontalTight/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconDotGrid1x3HorizontalTight/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconDotGrid1x3Vertical/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconDotGrid1x3Vertical/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconDotGrid1x3VerticalTight/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconDotGrid1x3VerticalTight/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconDotGrid2x3/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconDotGrid2x3/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconDotGrid3x3/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconDotGrid3x3/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconEuropeanUnion/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconEuropeanUnion/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconExclamationTriangle/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconExclamationTriangle/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconExclamationTriangleFilled/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconExclamationTriangleFilled/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconEyeOpen/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconEyeOpen/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconEyeSlash/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconEyeSlash/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconEyeSlash2/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconEyeSlash2/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconFileArrowLeftIn/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconFileArrowLeftIn/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconFileArrowLeftOut/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconFileArrowLeftOut/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconFileArrowRightOut/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconFileArrowRightOut/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconFileBend/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconFileBend/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconFilter2/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconFilter2/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconFingerPrint1/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconFingerPrint1/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconFolderAddRight/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconFolderAddRight/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconForYou/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconForYou/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconFormPyramide/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconFormPyramide/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconFullScreen/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconFullScreen/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconGemini/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconGemini/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconGithub/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconGithub/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconGlobe2/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconGlobe2/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconGrok/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconGrok/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconHeart2/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconHeart2/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconHeart2Filled/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconHeart2Filled/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconHome/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconHome/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconImagineAi/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconImagineAi/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconImport2/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconImport2/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconInitiatives/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconInitiatives/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconInvite/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconInvite/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconIsoOrg/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconIsoOrg/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconKey2/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconKey2/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconLayoutColumn/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconLayoutColumn/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconLayoutLeft/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconLayoutLeft/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconLayoutRight/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconLayoutRight/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconLinear/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconLinear/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconLinkedin/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconLinkedin/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconListSparkle/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconListSparkle/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconLiveActivity/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconLiveActivity/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconLiveFull/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconLiveFull/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconLoader/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconLoader/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconLock/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconLock/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconMagnifyingGlass2/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconMagnifyingGlass2/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconMinusLarge/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconMinusLarge/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconMinusSmall/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconMinusSmall/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconMoon/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconMoon/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconMouse/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconMouse/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconNotion/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconNotion/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconOffline/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconOffline/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconOngoing/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconOngoing/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconOngoingFilled/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconOngoingFilled/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconOpenai/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconOpenai/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPaperPlaneTopRight/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPaperPlaneTopRight/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPaperPlaneTopRightFilled/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPaperPlaneTopRightFilled/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPaperclip1/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPaperclip1/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPassport/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPassport/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPassword/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPassword/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPasswordStars/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPasswordStars/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPencil/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPencil/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPencil2/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPencil2/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPencil3/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPencil3/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPencilAi/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPencilAi/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPeople/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPeople/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPeople2/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPeople2/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPeople2Filled/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPeople2Filled/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPeopleAdd/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPeopleAdd/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPeopleAddFilled/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPeopleAddFilled/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPeopleCircle/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPeopleCircle/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPeopleIdCard/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPeopleIdCard/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPhone/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPhone/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPhoneDynamicIsland/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPhoneDynamicIsland/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPlusLarge/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPlusLarge/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPlusSmall/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPlusSmall/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconPrompt/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconPrompt/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconRandom/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconRandom/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconRedirectArrow/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconRedirectArrow/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconRemix/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconRemix/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconRemoveKeyframe/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconRemoveKeyframe/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconRepeat/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconRepeat/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconRescueRing/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconRescueRing/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconRotate360Left/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconRotate360Left/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconRotate360Right/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconRotate360Right/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconRunShortcut/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconRunShortcut/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconScanCode/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconScanCode/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconSearchIntelligence/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconSearchIntelligence/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconSearchlinesSparkle/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconSearchlinesSparkle/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconSecretPhrase/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconSecretPhrase/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconSettingsGear1/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconSettingsGear1/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconSettingsGear2/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconSettingsGear2/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconShield/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconShield/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconShield2/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconShield2/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconShieldKeyhole/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconShieldKeyhole/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconSidebarSimpleLeftWide/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconSidebarSimpleLeftWide/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconSlack/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconSlack/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconSpacebar/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconSpacebar/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconSquareArrowTopRight2/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconSquareArrowTopRight2/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconSquareBehindSquare1/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconSquareBehindSquare1/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconSquareBehindSquare6/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconSquareBehindSquare6/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconSquareInfo/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconSquareInfo/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconSquarePlus/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconSquarePlus/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconSticker/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconSticker/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconStop/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconStop/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconStopCircle/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconStopCircle/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconSun/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconSun/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconSupabase/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconSupabase/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconTag/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconTag/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconTarget/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconTarget/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconTelescope/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconTelescope/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconTextToSpeach/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconTextToSpeach/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconTextareaDrag/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconTextareaDrag/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconThumbDownCurved/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconThumbDownCurved/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconThumbUpCurved/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconThumbUpCurved/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconTimeFlies/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconTimeFlies/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconTimeslot/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconTimeslot/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconToggle/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconToggle/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconTrashCanSimple/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconTrashCanSimple/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconTrashRounded/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconTrashRounded/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconTwitter/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconTwitter/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconUnblur/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconUnblur/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconUsbC/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconUsbC/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconUserAddRight/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconUserAddRight/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconUserAdded/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconUserAdded/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconUserBlock/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconUserBlock/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconUserDuo/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconUserDuo/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconUserEdit/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconUserEdit/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconUserGroup/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconUserGroup/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconUserRemove/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconUserRemove/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconUserRemoveRight/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconUserRemoveRight/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconUserSettings/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconUserSettings/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconV0/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconV0/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconVariables/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconVariables/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconVercel/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconVercel/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconVibeCoding2/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconVibeCoding2/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconVisualIntelligence/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconVisualIntelligence/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconVoiceHigh/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconVoiceHigh/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconVoiceLow/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconVoiceLow/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconVoiceMid/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconVoiceMid/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconVoiceRecord/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconVoiceRecord/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconVoiceSettings/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconVoiceSettings/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconVoiceSparkle/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconVoiceSparkle/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconWallet1/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconWallet1/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconWallet3/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconWallet3/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconWeb3/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconWeb3/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconWindowSparkle/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconWindowSparkle/index.mjs create mode 100644 packages/origin/src/components/Icon/icons/IconWreathSimple/index.d.ts create mode 100644 packages/origin/src/components/Icon/icons/IconWreathSimple/index.mjs create mode 100644 packages/origin/src/components/Icon/index.ts create mode 100644 packages/origin/src/components/Input/Input.module.scss create mode 100644 packages/origin/src/components/Input/Input.stories.tsx create mode 100644 packages/origin/src/components/Input/Input.test-stories.tsx create mode 100644 packages/origin/src/components/Input/Input.test.tsx create mode 100644 packages/origin/src/components/Input/Input.tsx create mode 100644 packages/origin/src/components/Input/index.ts create mode 100644 packages/origin/src/components/InputGroup/InputGroup.module.scss create mode 100644 packages/origin/src/components/InputGroup/InputGroup.stories.tsx create mode 100644 packages/origin/src/components/InputGroup/InputGroup.test-stories.tsx create mode 100644 packages/origin/src/components/InputGroup/InputGroup.test.tsx create mode 100644 packages/origin/src/components/InputGroup/index.ts create mode 100644 packages/origin/src/components/InputGroup/parts.tsx create mode 100644 packages/origin/src/components/Item/Item.module.scss create mode 100644 packages/origin/src/components/Item/Item.stories.tsx create mode 100644 packages/origin/src/components/Item/Item.test-stories.tsx create mode 100644 packages/origin/src/components/Item/Item.test.tsx create mode 100644 packages/origin/src/components/Item/Item.tsx create mode 100644 packages/origin/src/components/Item/index.ts create mode 100644 packages/origin/src/components/Loader/Loader.module.scss create mode 100644 packages/origin/src/components/Loader/Loader.stories.tsx create mode 100644 packages/origin/src/components/Loader/Loader.tsx create mode 100644 packages/origin/src/components/Loader/index.ts create mode 100644 packages/origin/src/components/Logo/Logo.module.scss create mode 100644 packages/origin/src/components/Logo/Logo.stories.tsx create mode 100644 packages/origin/src/components/Logo/Logo.test-stories.tsx create mode 100644 packages/origin/src/components/Logo/Logo.test.tsx create mode 100644 packages/origin/src/components/Logo/Logo.tsx create mode 100644 packages/origin/src/components/Logo/index.ts create mode 100644 packages/origin/src/components/Menu/Menu.module.scss create mode 100644 packages/origin/src/components/Menu/Menu.stories.tsx create mode 100644 packages/origin/src/components/Menu/Menu.test-stories.tsx create mode 100644 packages/origin/src/components/Menu/Menu.test.tsx create mode 100644 packages/origin/src/components/Menu/index.ts create mode 100644 packages/origin/src/components/Menu/parts.tsx create mode 100644 packages/origin/src/components/Menubar/Menubar.module.scss create mode 100644 packages/origin/src/components/Menubar/Menubar.stories.tsx create mode 100644 packages/origin/src/components/Menubar/Menubar.test-stories.tsx create mode 100644 packages/origin/src/components/Menubar/Menubar.test.tsx create mode 100644 packages/origin/src/components/Menubar/index.ts create mode 100644 packages/origin/src/components/Menubar/parts.tsx create mode 100644 packages/origin/src/components/Meter/Meter.module.scss create mode 100644 packages/origin/src/components/Meter/Meter.stories.tsx create mode 100644 packages/origin/src/components/Meter/Meter.test-stories.tsx create mode 100644 packages/origin/src/components/Meter/Meter.test.tsx create mode 100644 packages/origin/src/components/Meter/index.ts create mode 100644 packages/origin/src/components/Meter/parts.tsx create mode 100644 packages/origin/src/components/NavigationMenu/NavigationMenu.module.scss create mode 100644 packages/origin/src/components/NavigationMenu/NavigationMenu.stories.tsx create mode 100644 packages/origin/src/components/NavigationMenu/NavigationMenu.test-stories.tsx create mode 100644 packages/origin/src/components/NavigationMenu/NavigationMenu.test.tsx create mode 100644 packages/origin/src/components/NavigationMenu/index.ts create mode 100644 packages/origin/src/components/NavigationMenu/parts.tsx create mode 100644 packages/origin/src/components/Pagination/Pagination.module.scss create mode 100644 packages/origin/src/components/Pagination/Pagination.stories.tsx create mode 100644 packages/origin/src/components/Pagination/Pagination.test-stories.tsx create mode 100644 packages/origin/src/components/Pagination/Pagination.test.tsx create mode 100644 packages/origin/src/components/Pagination/Pagination.tsx create mode 100644 packages/origin/src/components/Pagination/index.ts create mode 100644 packages/origin/src/components/PhoneInput/PhoneInput.module.scss create mode 100644 packages/origin/src/components/PhoneInput/PhoneInput.stories.tsx create mode 100644 packages/origin/src/components/PhoneInput/PhoneInput.test-stories.tsx create mode 100644 packages/origin/src/components/PhoneInput/PhoneInput.test.tsx create mode 100644 packages/origin/src/components/PhoneInput/index.ts create mode 100644 packages/origin/src/components/PhoneInput/parts.tsx create mode 100644 packages/origin/src/components/Popover/Popover.module.scss create mode 100644 packages/origin/src/components/Popover/Popover.stories.tsx create mode 100644 packages/origin/src/components/Popover/Popover.test-stories.tsx create mode 100644 packages/origin/src/components/Popover/Popover.test.tsx create mode 100644 packages/origin/src/components/Popover/Popover.tsx create mode 100644 packages/origin/src/components/Popover/index.ts create mode 100644 packages/origin/src/components/PreviewCard/PreviewCard.module.scss create mode 100644 packages/origin/src/components/PreviewCard/PreviewCard.stories.tsx create mode 100644 packages/origin/src/components/PreviewCard/PreviewCard.test-stories.tsx create mode 100644 packages/origin/src/components/PreviewCard/PreviewCard.test.tsx create mode 100644 packages/origin/src/components/PreviewCard/index.ts create mode 100644 packages/origin/src/components/PreviewCard/parts.tsx create mode 100644 packages/origin/src/components/Progress/Progress.module.scss create mode 100644 packages/origin/src/components/Progress/Progress.stories.tsx create mode 100644 packages/origin/src/components/Progress/Progress.test-stories.tsx create mode 100644 packages/origin/src/components/Progress/Progress.test.tsx create mode 100644 packages/origin/src/components/Progress/index.ts create mode 100644 packages/origin/src/components/Progress/parts.tsx create mode 100644 packages/origin/src/components/Radio/Radio.module.scss create mode 100644 packages/origin/src/components/Radio/Radio.stories.tsx create mode 100644 packages/origin/src/components/Radio/Radio.test-stories.tsx create mode 100644 packages/origin/src/components/Radio/Radio.test.tsx create mode 100644 packages/origin/src/components/Radio/Radio.tsx create mode 100644 packages/origin/src/components/Radio/index.ts create mode 100644 packages/origin/src/components/SegmentedNav/SegmentedNav.module.scss create mode 100644 packages/origin/src/components/SegmentedNav/SegmentedNav.stories.tsx create mode 100644 packages/origin/src/components/SegmentedNav/SegmentedNav.test-stories.tsx create mode 100644 packages/origin/src/components/SegmentedNav/SegmentedNav.test.tsx create mode 100644 packages/origin/src/components/SegmentedNav/index.ts create mode 100644 packages/origin/src/components/SegmentedNav/parts.tsx create mode 100644 packages/origin/src/components/Select/Select.module.scss create mode 100644 packages/origin/src/components/Select/Select.stories.tsx create mode 100644 packages/origin/src/components/Select/Select.test-stories.tsx create mode 100644 packages/origin/src/components/Select/Select.test.tsx create mode 100644 packages/origin/src/components/Select/index.ts create mode 100644 packages/origin/src/components/Select/parts.tsx create mode 100644 packages/origin/src/components/Separator/Separator.module.scss create mode 100644 packages/origin/src/components/Separator/Separator.stories.tsx create mode 100644 packages/origin/src/components/Separator/Separator.test-stories.tsx create mode 100644 packages/origin/src/components/Separator/Separator.test.tsx create mode 100644 packages/origin/src/components/Separator/Separator.tsx create mode 100644 packages/origin/src/components/Separator/index.ts create mode 100644 packages/origin/src/components/Shortcut/Shortcut.module.scss create mode 100644 packages/origin/src/components/Shortcut/Shortcut.stories.tsx create mode 100644 packages/origin/src/components/Shortcut/Shortcut.test-stories.tsx create mode 100644 packages/origin/src/components/Shortcut/Shortcut.test.tsx create mode 100644 packages/origin/src/components/Shortcut/Shortcut.tsx create mode 100644 packages/origin/src/components/Shortcut/index.ts create mode 100644 packages/origin/src/components/Sidebar/Sidebar.module.scss create mode 100644 packages/origin/src/components/Sidebar/Sidebar.stories.tsx create mode 100644 packages/origin/src/components/Sidebar/Sidebar.unit.test.tsx create mode 100644 packages/origin/src/components/Sidebar/index.ts create mode 100644 packages/origin/src/components/Sidebar/parts.tsx create mode 100644 packages/origin/src/components/Skeleton/Skeleton.module.scss create mode 100644 packages/origin/src/components/Skeleton/Skeleton.stories.tsx create mode 100644 packages/origin/src/components/Skeleton/Skeleton.test-stories.tsx create mode 100644 packages/origin/src/components/Skeleton/Skeleton.test.tsx create mode 100644 packages/origin/src/components/Skeleton/Skeleton.tsx create mode 100644 packages/origin/src/components/Skeleton/index.ts create mode 100644 packages/origin/src/components/Switch/Switch.module.scss create mode 100644 packages/origin/src/components/Switch/Switch.stories.tsx create mode 100644 packages/origin/src/components/Switch/Switch.test-stories.tsx create mode 100644 packages/origin/src/components/Switch/Switch.test.tsx create mode 100644 packages/origin/src/components/Switch/Switch.tsx create mode 100644 packages/origin/src/components/Switch/index.ts create mode 100644 packages/origin/src/components/Table/Table.module.scss create mode 100644 packages/origin/src/components/Table/Table.stories.tsx create mode 100644 packages/origin/src/components/Table/Table.test-stories.tsx create mode 100644 packages/origin/src/components/Table/Table.test.tsx create mode 100644 packages/origin/src/components/Table/Table.unit.test.tsx create mode 100644 packages/origin/src/components/Table/index.ts create mode 100644 packages/origin/src/components/Table/parts.tsx create mode 100644 packages/origin/src/components/Tabs/Tabs.module.scss create mode 100644 packages/origin/src/components/Tabs/Tabs.stories.tsx create mode 100644 packages/origin/src/components/Tabs/Tabs.test-stories.tsx create mode 100644 packages/origin/src/components/Tabs/Tabs.test.tsx create mode 100644 packages/origin/src/components/Tabs/index.ts create mode 100644 packages/origin/src/components/Tabs/parts.tsx create mode 100644 packages/origin/src/components/Textarea/Textarea.module.scss create mode 100644 packages/origin/src/components/Textarea/Textarea.stories.tsx create mode 100644 packages/origin/src/components/Textarea/Textarea.test-stories.tsx create mode 100644 packages/origin/src/components/Textarea/Textarea.test.tsx create mode 100644 packages/origin/src/components/Textarea/Textarea.tsx create mode 100644 packages/origin/src/components/Textarea/index.ts create mode 100644 packages/origin/src/components/TextareaGroup/TextareaGroup.module.scss create mode 100644 packages/origin/src/components/TextareaGroup/TextareaGroup.stories.tsx create mode 100644 packages/origin/src/components/TextareaGroup/TextareaGroup.test-stories.tsx create mode 100644 packages/origin/src/components/TextareaGroup/TextareaGroup.test.tsx create mode 100644 packages/origin/src/components/TextareaGroup/index.ts create mode 100644 packages/origin/src/components/TextareaGroup/parts.tsx create mode 100644 packages/origin/src/components/Toast/Toast.module.scss create mode 100644 packages/origin/src/components/Toast/Toast.stories.tsx create mode 100644 packages/origin/src/components/Toast/Toast.test-stories.tsx create mode 100644 packages/origin/src/components/Toast/Toast.test.tsx create mode 100644 packages/origin/src/components/Toast/index.ts create mode 100644 packages/origin/src/components/Toast/parts.tsx create mode 100644 packages/origin/src/components/Toggle/Toggle.module.scss create mode 100644 packages/origin/src/components/Toggle/Toggle.stories.tsx create mode 100644 packages/origin/src/components/Toggle/Toggle.test-stories.tsx create mode 100644 packages/origin/src/components/Toggle/Toggle.test.tsx create mode 100644 packages/origin/src/components/Toggle/Toggle.tsx create mode 100644 packages/origin/src/components/Toggle/index.ts create mode 100644 packages/origin/src/components/Tooltip/Tooltip.module.scss create mode 100644 packages/origin/src/components/Tooltip/Tooltip.stories.tsx create mode 100644 packages/origin/src/components/Tooltip/Tooltip.test-stories.tsx create mode 100644 packages/origin/src/components/Tooltip/Tooltip.test.tsx create mode 100644 packages/origin/src/components/Tooltip/Tooltip.tsx create mode 100644 packages/origin/src/components/Tooltip/index.ts create mode 100644 packages/origin/src/components/VisuallyHidden/VisuallyHidden.stories.tsx create mode 100644 packages/origin/src/components/VisuallyHidden/VisuallyHidden.tsx create mode 100644 packages/origin/src/components/VisuallyHidden/index.ts create mode 100644 packages/origin/src/declarations.d.ts create mode 100644 packages/origin/src/index.ts create mode 100644 packages/origin/src/lib/base-ui-utils.ts create mode 100644 packages/origin/src/lib/dev-warn.ts create mode 100644 packages/origin/src/styles/public.scss create mode 100644 packages/origin/src/tokens/_effects.scss create mode 100644 packages/origin/src/tokens/_fonts.scss create mode 100644 packages/origin/src/tokens/_mixins.scss create mode 100644 packages/origin/src/tokens/_reset.scss create mode 100644 packages/origin/src/tokens/_text-styles.scss create mode 100644 packages/origin/src/tokens/_typography.scss create mode 100644 packages/origin/src/tokens/_utilities.scss create mode 100644 packages/origin/src/tokens/_variables.scss create mode 100644 packages/origin/test-utils/describeConformance.tsx create mode 100644 packages/origin/test-utils/describeConformance.unit.ts create mode 100644 packages/origin/test-utils/index.ts create mode 100644 packages/origin/test-utils/setup.ts create mode 100644 packages/origin/tokens/figma/baseline/Value.tokens.json create mode 100644 packages/origin/tokens/figma/origin/Dark.tokens.json create mode 100644 packages/origin/tokens/figma/origin/Light.tokens.json create mode 100644 packages/origin/tokens/figma/origin/Value.tokens.json create mode 100644 packages/origin/tools/base-ui-lint/README.md create mode 100644 packages/origin/tools/base-ui-lint/manifest.json create mode 100644 packages/origin/tools/base-ui-lint/package.json create mode 100644 packages/origin/tools/base-ui-lint/rules/accordion.json create mode 100644 packages/origin/tools/base-ui-lint/rules/alert-dialog.json create mode 100644 packages/origin/tools/base-ui-lint/rules/autocomplete.json create mode 100644 packages/origin/tools/base-ui-lint/rules/avatar.json create mode 100644 packages/origin/tools/base-ui-lint/rules/button.json create mode 100644 packages/origin/tools/base-ui-lint/rules/checkbox-group.json create mode 100644 packages/origin/tools/base-ui-lint/rules/checkbox.json create mode 100644 packages/origin/tools/base-ui-lint/rules/collapsible.json create mode 100644 packages/origin/tools/base-ui-lint/rules/combobox.json create mode 100644 packages/origin/tools/base-ui-lint/rules/context-menu.json create mode 100644 packages/origin/tools/base-ui-lint/rules/dialog.json create mode 100644 packages/origin/tools/base-ui-lint/rules/field.json create mode 100644 packages/origin/tools/base-ui-lint/rules/fieldset.json create mode 100644 packages/origin/tools/base-ui-lint/rules/form.json create mode 100644 packages/origin/tools/base-ui-lint/rules/input.json create mode 100644 packages/origin/tools/base-ui-lint/rules/menu.json create mode 100644 packages/origin/tools/base-ui-lint/rules/menubar.json create mode 100644 packages/origin/tools/base-ui-lint/rules/meter.json create mode 100644 packages/origin/tools/base-ui-lint/rules/navigation-menu.json create mode 100644 packages/origin/tools/base-ui-lint/rules/number-field.json create mode 100644 packages/origin/tools/base-ui-lint/rules/popover.json create mode 100644 packages/origin/tools/base-ui-lint/rules/preview-card.json create mode 100644 packages/origin/tools/base-ui-lint/rules/progress.json create mode 100644 packages/origin/tools/base-ui-lint/rules/radio-group.json create mode 100644 packages/origin/tools/base-ui-lint/rules/radio.json create mode 100644 packages/origin/tools/base-ui-lint/rules/scroll-area.json create mode 100644 packages/origin/tools/base-ui-lint/rules/select.json create mode 100644 packages/origin/tools/base-ui-lint/rules/separator.json create mode 100644 packages/origin/tools/base-ui-lint/rules/slider.json create mode 100644 packages/origin/tools/base-ui-lint/rules/switch.json create mode 100644 packages/origin/tools/base-ui-lint/rules/tabs.json create mode 100644 packages/origin/tools/base-ui-lint/rules/textarea.json create mode 100644 packages/origin/tools/base-ui-lint/rules/toast.json create mode 100644 packages/origin/tools/base-ui-lint/rules/toggle-group.json create mode 100644 packages/origin/tools/base-ui-lint/rules/toggle.json create mode 100644 packages/origin/tools/base-ui-lint/rules/toolbar.json create mode 100644 packages/origin/tools/base-ui-lint/rules/tooltip.json create mode 100644 packages/origin/tools/base-ui-lint/src/code.ts create mode 100644 packages/origin/tools/base-ui-lint/src/lint-engine.ts create mode 100644 packages/origin/tools/base-ui-lint/src/rules.ts create mode 100644 packages/origin/tools/base-ui-lint/tsconfig.json create mode 100644 packages/origin/tools/base-ui-lint/ui.html create mode 100644 packages/origin/tools/figma-styles/fetch-node-css.ts create mode 100644 packages/origin/tools/figma-styles/fetch-styles.ts create mode 100644 packages/origin/tools/figma-styles/utils.ts create mode 100644 packages/origin/tsconfig.json create mode 100644 packages/origin/vitest.config.ts diff --git a/.mise.toml b/.mise.toml index 32c1a1ae0..c2ed2775e 100644 --- a/.mise.toml +++ b/.mise.toml @@ -2,7 +2,7 @@ MISE_NODE_COREPACK = true [tools] -node = "20" +node = "20.19" [tasks.deps] description = "Install all JS dependencies" diff --git a/package.json b/package.json index a854f268b..3d02ba099 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,17 @@ "ts-prune": "^0.10.3", "turbo": "^2.5.4" }, + "dependenciesMeta": { + "@central-icons-react/round-filled-radius-3-stroke-1.5": { + "built": false + }, + "@central-icons-react/round-outlined-radius-0-stroke-1.5": { + "built": false + }, + "@central-icons-react/round-outlined-radius-3-stroke-1.5": { + "built": false + } + }, "engines": { "node": ">=18" }, diff --git a/packages/origin/.gitignore b/packages/origin/.gitignore new file mode 100644 index 000000000..9a587fdbd --- /dev/null +++ b/packages/origin/.gitignore @@ -0,0 +1,25 @@ +# Override monorepo's blanket lib/ ignore — origin's src/lib/ is source code +!src/lib/ + +# Next.js (dev server) +.next/ +out/ +next-env.d.ts + +# Build output +dist/ +storybook-static/ + +# Playwright +playwright-report/ +test-results/ +playwright/.cache/ +.playwright-mcp/ + +# TypeScript +*.tsbuildinfo + +# Environment +.env +.env.local +.env.*.local diff --git a/packages/origin/.npmignore b/packages/origin/.npmignore new file mode 100644 index 000000000..dd7f4fc86 --- /dev/null +++ b/packages/origin/.npmignore @@ -0,0 +1,4 @@ +src/**/*.test.tsx +src/**/*.test.ts +src/**/*.stories.tsx +src/**/*.test-stories.tsx diff --git a/packages/origin/.storybook/main.ts b/packages/origin/.storybook/main.ts new file mode 100644 index 000000000..180be8958 --- /dev/null +++ b/packages/origin/.storybook/main.ts @@ -0,0 +1,12 @@ +import type { StorybookConfig } from '@storybook/nextjs'; + +const config: StorybookConfig = { + stories: ['../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'], + framework: { + name: '@storybook/nextjs', + options: {}, + }, + staticDirs: ['../public'], +}; + +export default config; diff --git a/packages/origin/.storybook/preview.ts b/packages/origin/.storybook/preview.ts new file mode 100644 index 000000000..d749a296f --- /dev/null +++ b/packages/origin/.storybook/preview.ts @@ -0,0 +1,22 @@ +import type { Preview } from '@storybook/react'; +import '../src/app/globals.scss'; + +const preview: Preview = { + parameters: { + controls: { + matchers: { + color: /(background|color)$/i, + date: /Date$/i, + }, + }, + backgrounds: { + default: 'light', + values: [ + { name: 'light', value: '#f8f8f7' }, + { name: 'dark', value: '#1a1a1a' }, + ], + }, + }, +}; + +export default preview; diff --git a/packages/origin/.stylelintrc.json b/packages/origin/.stylelintrc.json new file mode 100644 index 000000000..6c0fa0908 --- /dev/null +++ b/packages/origin/.stylelintrc.json @@ -0,0 +1,36 @@ +{ + "extends": ["stylelint-config-standard-scss"], + "rules": { + "declaration-no-important": true, + + "selector-class-pattern": null, + "scss/at-mixin-pattern": null, + "scss/dollar-variable-pattern": null, + "scss/percent-placeholder-pattern": null, + "custom-property-pattern": null, + "keyframes-name-pattern": null, + "scss/at-function-pattern": null, + + "declaration-empty-line-before": null, + "at-rule-empty-line-before": null, + "rule-empty-line-before": null, + "scss/double-slash-comment-empty-line-before": null, + "declaration-block-no-redundant-longhand-properties": null, + + "color-function-notation": null, + "color-function-alias-notation": null, + "alpha-value-notation": null, + "color-hex-length": null, + "number-max-precision": null, + "value-keyword-case": null, + "length-zero-no-unit": null, + + "selector-not-notation": null, + "property-no-vendor-prefix": null, + "property-no-unknown": null, + "property-no-deprecated": null, + "no-invalid-position-declaration": null, + "declaration-block-single-line-max-declarations": null + }, + "ignoreFiles": ["src/tokens/_variables.scss", "src/tokens/_effects.scss", "src/tokens/_text-styles.scss"] +} diff --git a/packages/origin/CHANGELOG.md b/packages/origin/CHANGELOG.md new file mode 100644 index 000000000..0ce4e74bf --- /dev/null +++ b/packages/origin/CHANGELOG.md @@ -0,0 +1,26 @@ +# Changelog + +## 0.13.6 → 0.14.0 (2026-03-05) + +- Added new chart components to the design system +- Added new Drawer component +- Introduced new design tokens +- Added Skeleton component for loading states + + +## 0.13.5 → 0.13.6 (2026-02-27) + +- Chart grid lines are now more visible (opacity 0.06 → 0.18) +- All chart axis padding is now measurement-based — labels adapt to formatted content instead of using a fixed 48px +- Y-axis tick count scales dynamically with chart height +- X-axis label thinning applied consistently across all chart types +- Horizontal BarChart value axis uses canvas-measured label widths for spacing +- ComposedChart dual-axis right padding is now dynamic +- Uptime: new `label` prop for an always-visible resting label (replaces `tooltip`) +- Uptime: hover indicator changed from opacity dimming to subtle height increase +- **Breaking:** `Chart.Uptime` `tooltip` prop removed, replaced by `label` and `labelStatus` + + +## 0.13.4 → 0.13.5 (2026-02-27) + +- Internal maintenance release (no user-facing changes) diff --git a/packages/origin/CONTEXT.md b/packages/origin/CONTEXT.md new file mode 100644 index 000000000..a56a8a4c8 --- /dev/null +++ b/packages/origin/CONTEXT.md @@ -0,0 +1,308 @@ +# Origin - Project Context + +> **Purpose**: This document provides full context for AI assistants to continue work on this project. + +--- + +## Vision & Approach + +Origin is a **complete rewrite** of the Origin Design System, shifting from a complex spec-generation pipeline to a **simpler, designer-first workflow**. + +### Core Philosophy + +1. **Base UI for Behavior** — Use [Base UI](https://base-ui.com) unstyled components for accessibility and interaction logic +2. **Figma for Visuals** — Extract CSS directly from Figma Dev Mode (already tokenized) +3. **Minimal Transformation** — Reduce pipeline complexity to minimize drift between design and code +4. **Designer-First** — The workflow is optimized for a designer who codes, not an engineer who designs + +### The Old Problem (v1) + +- Complex MCP spec-generation pipeline with many transformation steps +- Design drift accumulated at each transformation layer +- Heavy engineering overhead for maintaining generators +- Memory/context issues across sessions + +### The New Solution (v2) + +``` +Figma Design → Figma Lint Plugin → Base UI Component + Figma CSS → Done +``` + +--- + +## What's Been Built + +### 1. Base UI Lint Plugin (`tools/base-ui-lint/`) + +A Figma plugin that validates component structures against Base UI's expected anatomy. + +**Features:** +- ✅ 37 component rules (100% Base UI coverage) +- ✅ Detects missing required parts +- ✅ Suggests renames for aliased names (e.g., "Content" → "Panel") +- ✅ Auto-fix applies renames across all variants +- ✅ Only matches structural nodes (frames/groups), not text nodes + +**Usage:** +1. Select a component in Figma +2. Run the plugin +3. Review issues and click "Fix All" to auto-rename + +**Building the plugin:** +```bash +cd tools/base-ui-lint +npm install +npm run build +``` +Then import `tools/base-ui-lint/manifest.json` in Figma → Plugins → Development. + +**Rule files:** `tools/base-ui-lint/rules/*.json` + +### 2. Token System + +Tokens are exported natively from Figma Variables in W3C DTCG format. + +**Token sources:** +- `tokens/figma/origin/` — Origin design system tokens (Dark, Light, Value) +- `tokens/figma/baseline/` — Baseline/primitive tokens + +**Build tokens:** +```bash +npm run tokens:build +``` + +Outputs to `src/tokens/_variables.scss`. + +### 3. Icon System (`src/components/Icon/`) + +213 vendored icons from Central Icons. Icons are extracted from `@central-icons-react` packages and committed to the repo, so consumers do not need a `CENTRAL_LICENSE_KEY`. + +**Key files:** +- `CentralIcon.tsx` — Main component +- `icon-registry.ts` — Generated registry (do not edit directly) +- `icons/` — Vendored icon `.mjs` and `.d.ts` files +- `scripts/extract-icons.mjs` — Single source of truth for which icons to vendor + +**Usage:** +```tsx +import { CentralIcon } from '@/components/Icon'; + + + +``` + +**Adding/updating icons:** +```bash +npm run icons:extract # Regenerate vendored files + registry +``` + +Edit the `SECTIONS` array in `scripts/extract-icons.mjs` to add new icons. The script copies files from `node_modules`, strips sourcemaps, generates `icon-registry.ts`, and validates. + +**Packages (devDependencies — only needed for extraction):** +- `@central-icons-react/round-outlined-radius-3-stroke-1.5` +- `@central-icons-react/round-filled-radius-3-stroke-1.5` +- `@central-icons-react/round-outlined-radius-0-stroke-1.5` + +### 4. Analytics Context (`src/components/Analytics/`) + +Opt-in interaction tracking for all interactive primitives. Products provide a single `AnalyticsHandler` via `AnalyticsProvider`; components emit structured `InteractionInfo` when an `analyticsName` prop is set. + +**Shared hooks:** +- `useTrackedCallback` — wraps click, change, submit, select callbacks +- `useTrackedOpenChange` — wraps overlay open/close with duration tracking + +**Instrumented components:** Button, Form, Dialog, AlertDialog, Menu, Popover, Command, ContextMenu, Select, Switch, Checkbox.Group, Radio.Group, Tabs, Toggle, ToggleGroup, Combobox, Accordion, Table, NavigationMenu, Sidebar, Pagination, Menu.Item, Command.Item + +If no provider or `analyticsName` is present, the hooks are no-ops — zero cost for products that don't use analytics. + +--- + +## Project Structure + +``` +origin/ +├── src/ +│ ├── app/ # Next.js app +│ │ ├── globals.scss # Global styles + icon stroke CSS +│ │ ├── layout.tsx +│ │ └── page.tsx +│ ├── components/ +│ │ └── Icon/ # CentralIcon system +│ │ ├── icons/ # Vendored icon files (generated) +│ │ └── icon-registry.ts # Icon registry (generated) +│ ├── lib/ +│ │ └── dev-warn.ts # Dev-only warning utility +│ └── tokens/ +│ ├── _variables.scss # Generated from Figma tokens +│ └── _mixins.scss # SCSS mixins +├── tokens/ +│ └── figma/ +│ ├── origin/ # Origin tokens (Dark, Light, Value) +│ └── baseline/ # Baseline tokens +├── tools/ +│ └── base-ui-lint/ # Figma lint plugin +│ ├── rules/ # 37 component rule files +│ ├── src/ # Plugin source +│ └── dist/ # Built plugin +├── scripts/ +│ ├── build-tokens.js # Token transformation script +│ └── extract-icons.mjs # Icon vendoring + registry generation +└── CONTEXT.md # This file +``` + +--- + +## Key Decisions Made + +### 1. Base UI Over Custom Implementation + +Base UI provides: +- Accessibility built-in +- Keyboard navigation +- ARIA attributes +- Focus management +- Compound component patterns + +We style Base UI components with Figma-extracted CSS. + +### 2. Vendored Icon Registry + +Icons are vendored from `@central-icons-react` into the repo: +- Consumers do not need a `CENTRAL_LICENSE_KEY` to install Origin +- `scripts/extract-icons.mjs` is the single source of truth for which icons to include +- `icon-registry.ts` and `icons/` are generated — do not edit directly +- Tree-shaking still removes unused icons from bundle + +### 3. Figma Structure = Base UI Structure + +The lint plugin ensures Figma components match Base UI's anatomy: +- `Accordion.Item` in Figma → `Accordion.Item` in code +- `Panel` frame in Figma → `Accordion.Panel` in code + +This makes the Figma-to-code translation trivial. + +### 4. Separate AlertDialog from Dialog + +Base UI has distinct `Dialog` and `AlertDialog` components with different requirements: +- Dialog: Description optional +- AlertDialog: Description required (for accessibility) + +### 5. Structural Nodes Only + +The lint plugin only matches frames/groups/components, not text nodes. This prevents false positives from Figma's auto-naming of text layers. + +--- + +## Workflow + +### For Each Component + +1. **Design in Figma** with proper frame structure +2. **Run Base UI Lint Plugin** to validate/fix structure +3. **Copy CSS** from Figma Dev Mode (already tokenized) +4. **Create React component** using Base UI + copied CSS +5. **Done** — no generation step, no spec files + +### Example: Accordion + +**Figma structure after linting:** +``` +Accordion / Item +├── Header +│ └── Trigger +│ ├── Title (text) +│ └── Icon +└── Panel + └── Content (text) +``` + +**React component:** +```tsx +import { Accordion } from '@base-ui-components/react/accordion'; +import styles from './Accordion.module.scss'; + + + + + + {title} + + + + + {content} + + + +``` + +--- + +## Pending / Next Steps + +1. **Build first component end-to-end** — Use the lint plugin + Base UI + Figma CSS workflow +2. **Test the full flow** — Validate that the approach works in practice +3. **Add Storybook stories** — For component documentation +4. **CI/CD setup** — Token validation, type checking +5. **CI/CD setup** — `CENTRAL_LICENSE_KEY` in secrets for icon extraction if needed + +--- + +## Commands + +```bash +# Development +npm run dev # Start Next.js dev server +npm run storybook # Start Storybook + +# Build +npm run build # Build Next.js +npm run tokens:build # Transform Figma tokens to SCSS +npm run icons:extract # Vendor icons + regenerate registry + +# Lint plugin +cd tools/base-ui-lint +npm run build # Build the Figma plugin +``` + +--- + +## Important Notes + +### Central Icons License + +The `@central-icons-react` packages are `devDependencies` used only for icon extraction (`npm run icons:extract`). Developers running extraction need `CENTRAL_LICENSE_KEY` set for `npm install`. Consumers of `@lightsparkdev/origin` do not need the key — icons are vendored into the repo. + +### Base UI Package Rename + +Base UI was recently renamed: +- Old: `@base-ui-components/react` +- New: `@base-ui/react` + +We're currently using the old package name. Consider updating when stable. + +### TypeScript + +The `tools/` directory is excluded from the main tsconfig since it has Figma-specific types. + +--- + +## Related Files + +- **Figma Design System**: Set `FIGMA_FILE_KEY` in `.env.local` — see `.env.example` +- **Base UI Docs**: https://base-ui.com/react/components + +--- + +## Session History + +This project was set up in a conversation that: + +1. Analyzed origin v1's complexity and identified pain points +2. Proposed Base UI + Figma CSS as a simpler approach +3. Built the Base UI lint plugin with 100% component coverage +4. Set up the token system (origin + baseline) +5. Ported the complete icon system +6. Fixed several plugin bugs (variant handling, text node matching) + +The project is ready for building the first real component using the new workflow. diff --git a/packages/origin/LICENSE b/packages/origin/LICENSE new file mode 100644 index 000000000..60976825c --- /dev/null +++ b/packages/origin/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright 2025 Lightspark Group, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/packages/origin/README.md b/packages/origin/README.md new file mode 100644 index 000000000..eb931a16a --- /dev/null +++ b/packages/origin/README.md @@ -0,0 +1,176 @@ +# Origin Design System + +A design system built on **Base UI** with direct **Figma-to-code** styling. + +## Philosophy + +- **Base UI** handles behavior, accessibility, and keyboard navigation +- **Figma Dev Mode** provides tokenized CSS (copy directly) +- **Minimal transformation** = minimal drift + +## Quick Start + +```bash +npm install --legacy-peer-deps +npm run dev +``` + +## Structure + +``` +src/ +├── components/ # React components +│ └── Icon/ # CentralIcon system +├── tokens/ # Generated SCSS variables +└── app/ # Next.js app + +tools/ +├── base-ui-lint/ # Figma structure validation plugin +└── figma-styles/ # Internal Figma style sync (requires credentials) + +tokens/ +└── figma/ # Raw Figma token exports + ├── origin/ # Origin tokens + └── baseline/ # Baseline tokens +``` + +## Component Workflow + +1. **Design** in Figma with Base UI-compatible frame structure +2. **Validate** with the Base UI Lint Plugin +3. **Copy CSS** from Figma Dev Mode +4. **Implement** with Base UI + SCSS modules + +## Figma Lint Plugin + +```bash +cd tools/base-ui-lint +npm run build +``` + +Import in Figma → Plugins → Development → `manifest.json` + +Validates component structure against Base UI's expected anatomy. + +## Icons + +```tsx +import { CentralIcon } from '@/components/Icon'; + + +``` + +213 vendored icons from Central Icons. Edit `scripts/extract-icons.mjs` to add icons, then run `npm run icons:extract`. + +## Tokens + +Color and spacing tokens are built from exported Figma variables (`npm run tokens:build`). Typography mixins (`_text-styles.scss`) and shadow variables (`_effects.scss`) are generated from an internal Figma file and committed to the repo — external contributors don't need to regenerate them. Don't edit these generated files by hand. + +## Scripts + +| Command | Description | +|---------|-------------| +| `npm run dev` | Start development server | +| `npm run build` | Production build | +| `npm run storybook` | Start Storybook | +| `npm run tokens:build` | Build tokens from Figma exports | +| `npm run icons:extract` | Vendor icons and regenerate registry | +| `npm run test` | Playwright component tests | +| `npm run test:unit` | Vitest unit tests | +| `npm run test:all` | Run both test suites | +| `npm run lint` | Run ESLint | + +Internal maintainers with Figma credentials also have `figma:styles` and `figma:node` for syncing styles from the design file. + +## Using as a Package + +### Installation + +```bash +npm install @lightsparkdev/origin sass +``` + +Or for local development: + +```json +{ "dependencies": { "@lightsparkdev/origin": "file:../origin" } } +``` + +### Next.js Configuration + +```ts +// next.config.ts +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + transpilePackages: ['@lightsparkdev/origin'], +}; + +export default nextConfig; +``` + +### Import Styles + +```ts +import "@lightsparkdev/origin/styles.css"; +``` + +### Copy Fonts + +```bash +cp -r node_modules/@lightsparkdev/origin/public/fonts/ public/fonts/ +``` + +### Usage + +```tsx +import { Button, Input, Field } from '@lightsparkdev/origin'; +``` + +### Advanced: SCSS Token Imports (Optional) + +If you need Origin mixins in your app SCSS files, configure Sass package imports: + +```ts +// next.config.ts +import type { NextConfig } from "next"; +import * as sass from "sass"; + +const nextConfig: NextConfig = { + transpilePackages: ['@lightsparkdev/origin'], + sassOptions: { + importers: [new sass.NodePackageImporter()], + }, +}; + +export default nextConfig; +``` + +Then use `pkg:` imports: + +```scss +@use 'pkg:@lightsparkdev/origin/tokens/text-styles' as *; +``` + +For full setup details, see [Using Origin in Your App](docs/using-origin-in-your-app.md). + +## Typography + +Suisse Intl uses font metric overrides for precise line-height control: + +```scss +@font-face { + font-family: 'Suisse Intl'; + ascent-override: 81%; + descent-override: 19%; + line-gap-override: 0%; +} +``` + +These values are applied to all weights (Regular, Book, Medium) in `_fonts.scss`. Consuming apps should import Origin's fonts for correct input rendering. Without the font, the system falls back to `system-ui`. + +## Documentation + +- `docs/using-origin-in-your-app.md` — Token/font setup for consuming apps +- `CONTEXT.md` — Full project context and history +- `.cursor/rules/` — Auto-injected context for AI assistants diff --git a/packages/origin/eslint.config.mjs b/packages/origin/eslint.config.mjs new file mode 100644 index 000000000..b4b4dc7e0 --- /dev/null +++ b/packages/origin/eslint.config.mjs @@ -0,0 +1,40 @@ +import reactLib from "@lightsparkdev/eslint-config/react-lib"; + +export default [ + ...reactLib, + { + files: ["**/src/**/*.{ts,tsx}"], + rules: { + // Pre-existing issues in origin code — to be cleaned up incrementally. + // Chart utilities use loosely-typed data structures from external charting libs. + "@typescript-eslint/no-unsafe-assignment": "warn", + "@typescript-eslint/no-unsafe-argument": "warn", + "@typescript-eslint/no-unsafe-call": "warn", + "@typescript-eslint/no-base-to-string": "warn", + }, + }, + { + ignores: [ + "node_modules/", + ".next/", + "dist/", + "playwright-report/", + "test-results/", + ".cache/", + "tools/", + "scripts/", + "playwright/", + "storybook-static/", + // Test and story files live inside src/ but are excluded from tsconfig.json, + // which breaks type-aware eslint rules. Ignore them from linting. + "**/*.test.tsx", + "**/*.test.ts", + "**/*.unit.test.tsx", + "**/*.unit.test.ts", + "**/*.test-stories.tsx", + "**/*.stories.tsx", + // Dev-only Next.js app + "src/app/", + ], + }, +]; diff --git a/packages/origin/next.config.js b/packages/origin/next.config.js new file mode 100644 index 000000000..0bdd90f74 --- /dev/null +++ b/packages/origin/next.config.js @@ -0,0 +1,10 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + // Enable SCSS + sassOptions: { + includePaths: ['./src/tokens'], + }, +}; + +export default nextConfig; + diff --git a/packages/origin/package.json b/packages/origin/package.json new file mode 100644 index 000000000..c07d73da8 --- /dev/null +++ b/packages/origin/package.json @@ -0,0 +1,113 @@ +{ + "name": "@lightsparkdev/origin", + "version": "0.14.0", + "publishConfig": { + "access": "public" + }, + "description": "Origin Design System v2 - Base UI + Figma-first approach", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "git+https://github.com/lightsparkdev/webdev.git", + "directory": "js/packages/origin" + }, + "type": "module", + "main": "./src/index.ts", + "exports": { + ".": "./src/index.ts", + "./styles.css": "./dist/styles.css", + "./tokens/*": "./src/tokens/*" + }, + "files": [ + "dist/", + "src/components/", + "src/tokens/", + "src/lib/", + "src/index.ts", + "public/fonts/", + "skills/", + "README.md" + ], + "scripts": { + "build": "yarn build:styles", + "build:styles": "sass src/styles/public.scss dist/styles.css --no-source-map", + "build:watch": "sass --watch src/styles/public.scss dist/styles.css --no-source-map", + "clean": "rm -rf dist", + "dev": "next dev", + "format": "prettier src --check", + "format:fix": "prettier src --write", + "lint": "eslint src/ && stylelint 'src/**/*.scss'", + "lint:fix": "eslint --fix src/ && stylelint --fix 'src/**/*.scss'", + "lint:styles": "stylelint 'src/**/*.scss'", + "lint:watch": "esw src/ -w --ext .ts,.tsx --color", + "package:checks": "publint && attw --pack . --ignore-rules cjs-resolves-to-esm internal-resolution-error --exclude-entrypoints ./styles.css", + "storybook": "storybook dev -p 6006", + "build-sb": "echo 'Origin storybook requires @storybook/nextjs — run locally with: yarn storybook'", + "test": "vitest run", + "test:ct": "playwright test -c playwright-ct.config.ts", + "test:ct:ui": "playwright test -c playwright-ct.config.ts --ui", + "test:unit": "vitest run", + "test:unit:watch": "vitest", + "tokens:build": "node scripts/build-tokens.js", + "icons:extract": "node scripts/extract-icons.mjs", + "types": "tsc", + "types:watch": "tsc --watch", + "check:baseui": "node scripts/check-baseui-version.js", + "prepack": "yarn build:styles" + }, + "dependencies": { + "@base-ui/react": "^1.1.0", + "@base-ui/utils": "^0.2.3", + "@tanstack/react-table": "^8.21.3", + "ajv": "^8.18.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "next": ">=13", + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "sass": { + "optional": true + } + }, + "devDependencies": { + "@arethetypeswrong/cli": "^0.17.4", + "@axe-core/playwright": "^4.11.0", + "@central-icons-react/round-filled-radius-3-stroke-1.5": "^1.1.153", + "@central-icons-react/round-outlined-radius-0-stroke-1.5": "^1.1.153", + "@central-icons-react/round-outlined-radius-3-stroke-1.5": "^1.1.153", + "@lightsparkdev/eslint-config": "*", + "@lightsparkdev/tsconfig": "0.0.1", + "@playwright/experimental-ct-react": "^1.57.0", + "@storybook/nextjs": "^10.1.10", + "@storybook/react": "^10.1.10", + "@testing-library/dom": "^9.2.0", + "@testing-library/jest-dom": "^6.1.2", + "@testing-library/react": "^14.0.0", + "@types/node": "^20.2.5", + "@types/react": "^18.2.12", + "@types/react-dom": "^18.0.0", + "@vitejs/plugin-react": "^4.0.1", + "dotenv": "^16.3.1", + "eslint": "^9.0.0", + "eslint-watch": "^8.0.0", + "jsdom": "^25.0.1", + "match-sorter": "^8.2.0", + "next": "^13.5.10", + "prettier": "3.0.3", + "publint": "^0.3.9", + "react": "^18.2.0", + "react-dom": "^18.1.0", + "sass": "^1.80.0", + "storybook": "^10.1.10", + "stylelint": "^17.1.1", + "stylelint-config-standard-scss": "^17.0.0", + "typescript": "^5.6.2", + "vitest": "^3.1.4" + }, + "engines": { + "node": ">=18" + } +} diff --git a/packages/origin/playwright-ct.config.ts b/packages/origin/playwright-ct.config.ts new file mode 100644 index 000000000..f1dda4fd8 --- /dev/null +++ b/packages/origin/playwright-ct.config.ts @@ -0,0 +1,45 @@ +import { defineConfig, devices } from '@playwright/experimental-ct-react'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +export default defineConfig({ + testDir: './src/components', + testMatch: '**/*.test.tsx', + testIgnore: ['**/*.unit.test.tsx'], + snapshotDir: './__snapshots__', + timeout: 10000, + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : undefined, + reporter: 'html', + use: { + ctPort: 3100, + trace: 'on-first-retry', + ctViteConfig: { + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, + css: { + preprocessorOptions: { + scss: { + api: 'modern-compiler', + // Mirror next.config.js sassOptions.includePaths + loadPaths: [path.resolve(__dirname, './src/tokens')], + }, + }, + }, + }, + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], +}); + diff --git a/packages/origin/playwright/index.html b/packages/origin/playwright/index.html new file mode 100644 index 000000000..71b26ad9d --- /dev/null +++ b/packages/origin/playwright/index.html @@ -0,0 +1,13 @@ + + + + + + Playwright Component Testing + + +
+ + + + diff --git a/packages/origin/playwright/index.tsx b/packages/origin/playwright/index.tsx new file mode 100644 index 000000000..3891a50f2 --- /dev/null +++ b/packages/origin/playwright/index.tsx @@ -0,0 +1,2 @@ +import '../src/app/globals.scss'; + diff --git a/packages/origin/public/.gitkeep b/packages/origin/public/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/packages/origin/public/fonts/SuisseIntl-Book.woff2 b/packages/origin/public/fonts/SuisseIntl-Book.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b43587ca4f22493f43ec8ea54f27bfd48c681903 GIT binary patch literal 65220 zcmV(}K+wN;Pew8T0RR910RF@P5C8xG0|>AH0RChE0RR9100000000000000000000 z0000PMjC`*8-<)69N{7cU;v(65eN!}pa6uiCkvKH00A}vBm=Ds1Rw>6dOh_0XZ2aN=2fjXX9{94qoBB)R8k|Tk^yTa54ez6(F8#dR2qYUU}pw`Y-j|T zPu#_5I9(lmd)kPms+GBWMZtJ}v-&wBAz7IlLqx1SGACGy?$HnOzy63X0)PpoccaoGR^h>g6A-mNuK;QCvYeYM7bezwAF~ zk}xVOgHaMBDJbtpv2ibISdS=wh!+>XWG5C1#a4Nhqu8ktW57jy8;rrl02HaTKBib= zizBY(i7z6g#H=dGZeR!QKBgErqB)zH+Y^oWMf4&{z$=8(I+g!VMT{D}s5muc2)5Z_ zBVb^osD#y+n4pLtZD2x6sGwp7=CrqVb5$HfJesbQZ@~?Ix%1-Uc%&J|D$vr zLv&U2P8P*D|> zR176vF;r9~HKk}ph1cRaow)aR1(Hdi5k>IU+JCG)yiKi7Q(xO$(SCw{0WeFB*D+8G z9HS&lMj_8=7~T-u^gQ0~jc9^{(31c|OeCd0IH&0jIzmQ{NZpP3K*0j1>H7R^%?m&P zDq1wFXS?8GPhbTSp`%=c^ARq%At?6S@9+-s!zALbMDg*l5iSO^bsBe1!h4-t#zgV{)gJkn4V|SQ&*(w-!o&so3Ej1HVqn42odoC zPKM{_w1;UC3mO6;332=X=f{53iIRk1K?+`|D5YYn*xGIFwDZpNcDvrBw{_NuNN=L^ zyqkF;;YcG$ax_Ay17KT{>1W5*N7l9X0>c|mpt|JQ%+Z|-@=am?@ir`x>$-2c!1CP|VcX_6*M znyi&3NjgcAG)a><&X_aCJ=Zb+*od{!k7_9W2XWTl!y}q5qfcSTY36u|rDY1NMOv zg$e*}IezWbVPqI@8M_RZ^01bNCHJnxLGZs$-%kNo30$fSdRL+ggRroLfYi3->>0-7 zmp*0ttqo%vwr1r|>+6cP;z$~>0Fi?2U2llocX)AV%{5|LLhRIEd>eQuCO5=OCI?yo zAiyD;vW5?$n(nfJzUeCRUBD^Q#sSfa>!nx-Xv=Kl>EdlM@QvgUMm?D)BiN!<2 z0VM-y$ZW!0+yX?%uAd+4{Qr~f$$K7D7+eX-q_G?doP-iLkv_Jf}dLKrhfHz!Rh>E%7aY|1e0`$8e%_Yt1C(c!dyH(I>$PFwm{#nvFjQjPo!Z zEak9^Ot%6*p4TS3Ex7^4A(Tc)NeChI{nqchr5)!7&LYVc2Lt>#KGt$Ty`G;M@ZzFm zQi2>0-`|`1-`+W?U6(W*dq&$zdeKtBLz@K)1~ei8%XmPN|1;HW=kxDB&4SQ7j8=G$ zI47>|_JMY$T{MJ3(fRec=+a_l7t6uNh{Qn&T;T$72}&6kNh$#jAr?)l?25r5COXtt zG=8q!6)ro&|KrS0>ZjMuHqn`oCjviU0}G+Y=@RSCY9U1^KV1=<0#;Z?%Rlt{tl4=v z?6ZcLAQ6&6m=sop*O~QJ*uF{Em!qgwvlx+Ctf7!d=HHfS`~S|t=w#SA873?RC9@Q2 z&DaLJ6xE*@t#@X=WG|g=R(m;%{7!VaB{{1*)~;x?$9n*5gjwx@z_8LD%OEhJWMZy@ zV8G5Vm5VZEiawR?&Z(P}>B`i3slvnezFL|7(=6uuvn$vSg!Vuw~>s^jB|fjtr`sFFfG^XTh;}U^|7K%nX;B5~m=g;pqA7*-BW*XoUz`Eg(%LT9w#2Iw| z?&+SMhNU?Y++*!x&v5s=qd7~;+eki$jB}xU6bunzWqFkMp)%zcN||CsxzbQUDDe;f zH$0w2J-dQ^$C_-@FM$n=Cm2r*$3y(mW^^j(Kso^LAU zy+5$7u2_VbLKq{AaFHTqioo;R_hoagkon59DI|#0iin7ah`1uP(p2*POEz-Le%hNz zpj3Ctr9I>+V&0rzYns#O{T(UKYVHa#7_l+N2t}Awseb)^H>$Vl?{UxancmawFo+cq z2_b|>2x3p)`I$v>7^NB3Dc1&Lgb>1*hwzr4?=vU9|9zb->HZERgzoNpy}wdI3Bd$o zj1fWzAqHatFwbL_p%6tQ26OS6T1!nVx%g_8LyA^WN-4QOS-M~6er&~; zUiqsx4L}=^m;n^odw&?4^=^6*@!QS<#RLNh!9ssQ2%rH-3}~xOc_>3a0Bq64=X+rO zQ(^+le{1Oh^FLSxz$5^GAS5)fcY*){=m5~C5R)Ms5El!Qmd3~^5||tW2;`tj4Tv2( zAVGqFgbD?bDisJqIgnblKss~)88;4O+BA?uCqM}(0H|;ba+Hc)j@o-BM_oZcO$Y<3 zo&%_ev>6I-?+<&MpL~%S!<2no@y!q(-2gsRgL#Y6I$p zx`2A69-!W60I0Vb0qVWRfcmH@pgwIDs4rRs>eqIG`nUf;t<4bwD3S`iQB3R7<$0qav^g(9@`jB%1J>xt;&%ZFxi*E$zjW-6veK!Ha zhu(`oe|V-~_|x+j=zoSqP9)wDDE^;gU<|wyP`2!;++4Y1V0qor!Sb&4f|Zj$Umy_V zYr1hz_H6=~hi(~^C(av~C(jp@rz{YdXDkSmXDu0&*DW2CcdZzdcdrDP_pB6@_YMKf z`&I?YhgSp4M^^{R$5#)`C)Nncr`80_r`HPt1Ymq3rQk|Jd(<(Fii~NK6uzlY+#&tkn0Cf0Ggy;lL5(Z`=$6?xk=;F>Z77xFQGyS)? zY*#${6tDk^>u-8^?%&g$=CBb|5yLJN@i>Gd0jEeL;u4J{++vZ8M?6ySN^Gs-lY~&7 z*%bL{`?CWARyn%k0=;t+jUY@6>dX&4xF}+fxpG@DQ_eBpS3XV+1rPs?Nt2^UnJSGd zK=5Q=w%4!z4QOCXikQnUqxEgV5&FMWx87Y3!_a=~4!g7Nx_ba|AOsZb+`NK9!s09i z6;-X#N+%l7J>WrjoSuc3PreDEVdR7gY*J_P!SD;nS7@oIQt6~dlA1$4zZHL-ueUG- zg@h%fgqdm8->A1;JNpjx8GG&~?~Waffn7MVV!FgG^+?fL>fJY|E9}IbqATxoT|?LQ z1U#Wn^pp4uFv31hg)r%CJV1j2kA|IuiQpQBCTm%N~xujL5Qq!$R&^bGoIJ#CXtFNp_H;J zsH8*HwUNI1cj{`Ov8(hd_)iP3(*Zh6U!)r@l2Y^nz1rWRJ9O7vZzh4owk4_MMrSH( zIE)B0K4i<=P27aT&S8y`i&*5e)KwSV5M|X~L;JDH{jYYEUsMaUBGg*z=kO@#;)43o3xP=aycLgI^HXhwpOW0V;- zqsJJB6MjTl%X*Za)X~N8`H@)Th%26x{RxIlv@4NRvMHpL!{_9BTIpu+*~j^pMb`oM zI?GG7$PAG`St+;xSK$`yz;3w}R9tE0RaMi?8f&htTiq^NyhOu|m1=sj=2~pI)i&C0 zuftC2b+t`-ra60ycQ-Asv^!hix< zNt_f`9Juh{CkRRQnMO%u1G)HuC$YpKby{>8FyZNOuL#{Eo z3KT0orVao7V)pC*>0eG}e}mTX2%e;^;Sv9&Bn69w*ItB(f;75pDD_#e!r{D9+>#mVi)- zB%b8zndEbjN@{7QlYT~-W>y%g2V`E5P6^I&nXQ+`<&;lkZTWhYRaaL-ky`7h>q(ya z8%$)QP4uUlZK0(erg~fL8WiK7_}k>yU2I(df#p|iNJLV&xPnxrC62f=k2}G{lTJR> zG~1lhbpwIR!_wYJzGUp8TMA6^h`vUg=U&DF{7RF_g zy+5sy?$iwn4y%$BnTYX8h7RTM*^iXIaxPhwO+zl?ee`JbI_`JG)uushZQQK24!wyz zHGpW8{x#YYZHDjUJNk8g!?b(!Cw>?Gb)5^Om1N{mm45lya@q&|;JkWxLzI@Y|FBga z&ODoM>mU6?%?g-4VyDfF^_aR|_L1tMr(GPn_a4=O#dGfw1uQjWG&JhTBSnX)q1RP3 z-GfvTwBn%SKOo%>nAL*>#EgNnt-s}E{tpelhJfP8{Md(mi*0O!f`WrXKoBNOj2M)s zZ`84y_90@NTQ66S<;YQ_NSQKKsx(I9ZOhdd+t}V*fE9Z4`|3QWy6*SPa(pY5Gp~UY{=Ze6jH#3 z+Mx|Znwiz3*K{#yH;XJ_*EyU|m(*G_pFW#);}!!ma0%pEx-c8MgzQ*^i1AC@j3qBg z^OjKt9dOGZSFy^d*c7W#d)D5M*j>%p_0Y^%%{+AM=l*joTs_}6S6lws7tNnEN@UYI z4cbNo;zslp5DEegWwY1138jHh383x1eoaqz*|OKY31tJJdcfIS*?3*mR~z$d960#! zi4a+1&H82iW^#Sf&Xg#rQPa8MraP|25D?a3^;-PM95}de@!;XdFGvsxDN0m=gcK>+ zOZI&06Cb|Sn^kk+0{+ve4HrjGEjTGi8~+y?in%l_$gq4}u5Uf%``Krjph zF9N{^5F7!5Q$TP52(ALbEuit0S94&o%WApeDg+g0aiv?L@*}D`qM9SRc|?sz)OV8!z*M1%Grq@&nwc@=v3v-zCEJf@@lDs7Uizdm`LWE7eNH)xkh>tT1!|z(+lWPu_TG3+mws4$6H6Yk%n{2U zv4bO4IbyXV);waJBi27+qa!vw+VdWN=Wo;Vd9(apYwJOA0QF{=)x&|;BSF?T;auO2 zdwusC|B@X)om$BzKCScI@W&Nn5n3-Gs$NEXJp!p-2esZjm?b*(Hlme`V8i;h-uYKn z{T=&hCu*&5ZWb1>iZrt)EeWy3#T8m2&Gb0PE@RTWoRI62U+pd2ngU_Fd3+zQa!-U$ zDR7WFQeOI|q(zg=qIc~dVLtG9$EUN%%r^RYZd{`~uutd13 z$opMKyZNClRm8PwMd?OCRk(;{;Gw;WlV6|BS+GXbVSlmW69~6uY!*2v3K$ym(zm#A z*6*BVT%VZ0=<0>MLc7Znp<9GJQj4y*Oj_Vcc)EsV3du!C_c*U>F68;kz1zCaDazFO zwy|P`XH6c}h!C;1ENd2X1ULldr^Cm?Jmfbs4w$y*N$!EbJJO zZ(guIk-SuY;+ZL9yPQ0pcgMi_8%bXk_)(EYqB!y36CYBXnDVCNJwhYQ=yKl#E`$+n zw%!%dm5Codkw65|Mq%OpfZojBmpeIh_y~j07tjKvI5@5nJk@GBnI_md#|8h(AU_Bg z!u<)j_7~668Yv$AMAcw9Xwnbm4~q|bMULCAqQ=G4d=qqRGZejnQ0*q}v~5Mwe`RvU z>Wg|-t4cMhFL84%Se)tf)Ht(fm7bpxJQ&(yV;J_fsZE!5$v1l&V%)3XoQv4qS=7226hFuIb5BPK0nuBu9PPu8aOeHYeW`B^nj!o_yg z4`iiJbs?r@1*mbGWIYI9gjicPKxnnwM#!T*f&g0A>(d~+Y1NqY$T)}NXq#X`TO(oS z&6Rn(?N;cVmF8$9)Th2aS7%jtIA2#X)ky2MGU;2>E`1k~iPL2M@d_z(8MglIl{p<^ z_6Tzs#E|Zqn3@~srHjG^CiEGp^H))c2KDo)W0?aqFoaiTw zvo`X+(kvU&(j;*8idWF767@>qd}a`NW}U&grSEqwiIGGKPY2=q-0*BbN(gs_6*%1I z2+W872R;!LUq8q7+5J`thG(ZfrFm^z>F+L0i`SbnuZ_BXw0Ly2s9=8?+9NcU;wCsf zud2pXSA6=*6G z$){oiC@$V#<5_9{U&u*u@B3K_+?nl+5g)5yF2sgQMQ?gQ01o;vLIW~b#J4Xj))jh6 z@n>=@Udczj_;+^uc(EVep(xX5))2`8f6xnQAyb6^M6GZ)%}PZD{KGj@K3$|{ zzam8PTG)PuP(B$f$V0kqVbjZ{S~Ncjwhwz9hu0~-E@|^5s_m?QzSeUpiS#S_L|`j9 z)3f5jv%5ZY3o6bc{2hHcjg(;h`KfOc7=%3N;{FtL=t`o^Lq<_UFU6dL<(?gTX8o&4 ztVVzLEQ|`SioBAV;lRylsy2m`22pLw)b|;+O1+pue`=I_Z_P;bq5LgWTt>YvchfEI zlrKvx!B%L0TrTuSJf4<5RYpunae6y;%1x)wru&qaepGTaP?j=VMnrvKLut6rZI(G~?%RGUV0H~dH9a9T0v#I<^Eq+0QfPQS zTn%^l5dUL)x8=Ry?6~f`O5mX*Rl9B~o;(VKE~2OgNo}OGv*>$roz5QPvmA(Flr_y1 zUB`Q-G()1@5pqQ#MGZZ{L~O6)Rb0l?17qC+8-`C>!fa3+kubh?F-bqsH?Sp{bJkcu z32aC=i_`hjvrN8wEe|sbQEjBSo8Dbw=|eX2ppdm1FG7mg`=6HOA= z5cw5>;1cs0@64H^$3uIbadAIQx{Jw{kPpI?uc=3_c-Kw^EzZ7=m+uy;irlyv^LVYL z$|JXifWoFv(T}8z_;hS1PMBdFNGy^7M%btd64of6)#gKI11i+_2G=7KAt|_EFTo{n z5UH!4>#7bY{Sc+V#N6rhZtQxV7~e`;^mSW**we(BY#Z0vBv`u4ix8&CDpDipbQG~{ z1X`t;cJohK#7?auo+OUA;<>|@-_v>4Nn7UKQ)c_Rx2rR`yjriJ)3UpHw^=*A2kRXZ z`z(}Iarbdq$tCn;GR1~r7~WR)Xv0bz$+t1O_YK9^=1lF=FZz9XVk}+^yN3)uea#~? z1QRHP_8PJn@kv_ieypdaNt7O1&uAcq_`@OlICi>7&%_XBWe|KHs#!u_#+i7jC5Q|R zbOqz9I{f16*6Yh1g5lIUGgD_y_*OBBVy*ZXq>c#&23D%wB{H<0y5|U_zsppaCSN*_ zU=&h9$I6HmycSIWpP|^Lj;jVDnJ2E|8>Zq}SoL7kg5V)vHO=I@n$?iaEt{_R8C>+& zsI2z-qv9rkfm6F0eMx07dW{NEo}r#2yzrcqNddWRW)eqyS(K(H zJb&JaI-Hl}8IXz)R9Aeuhs?Cd*8;&9o)l-DztckTL9aXKMt>>ZNz;hiU$*yL`!l|Y z*$9$jbm82c|7HXia?PMZ&v0cx!iSB zB8P$`zMubb_zza*>-~X$=3lL253ggFEYW_Bhsw~=1&wkrUO4B${L2Hoh0pKj*_~%< zvD=HEJQjIf0)>w~Z-vpp^vLxH8+z#lc>t_5CGY8fG4cj+oISit+VPT*eTJ3lJN@K) zd^w@X^`0JI^4_SmJTc}u7X+b1DXCJ-fNFsUf8s_yLw_meL-MCt&Fl{k64j{v0=4NP z*fOPr8_@=9$kClu*2vt6+;VB22sUI^`clLgoef$E4?46!rv?01-C{9)DQ=IIy{Sy! zH}4na!vTbmJ+hTz@@P}^Yod3&SwYlz3&LdP+$4yKBGRVW?-7G|zG5laDkjs>1zN}~ zE)aphvwD;1Yxpm`g z=Y*i|O3;Fu7#r%sjqD?D$;V|dl<*$bBXMQYE3bh#^ZHwg`Vo2

`kVFVqx!E$v_0$Z8Sj{M{R-u>-9FqG@ukR^ zgZH&@WCFe-lF^gC8Uje}*q^enPy#}8Pt}nwmh?e!kV39JUYKm?lVgaC0DI99?stEWMVuVn$P5= zPHVLsac7vDrLV8X%62str_dP2!E^~Gj9PU9!daAOg=J?d=1J1hiWVJjFv5eC6eX>? z5uy8#J<~q=Lbyxf&5>5F%5kCkPv%DS^j-@|u6S^GH~+?dleK~3pR7^QVy<|{qoq&! z)eNg$o|)(qrD9d`Le7?vewNmqR;JVFslQ|5)e_EB!Ux?m&NqwO`+dQnYe7gU7>*#G!6jd^~sS;o_)Yw@NAZU*?q#)QI&_1@O#Ezc73{mSD(?CxuGAV`oS$Y0A>Ym=pq-Z=oMmNrH~ z&5>b#WqH=?)^@aqH1%gOikc$j&3I!rIQfo5gkCYb&K6_=Z_eQ0!2FZP0frO63$U4g zgtP->l#q^fmm~+~RPO3ccCt!!Abi`dz`5zO9(mIdRb{y0EfZ3y% zTXIcA^by{QdsDzfel6bich?hLIm~Q{&}4foBz9H&%CrGV>u_2B7@9u(kAN7A;XD=oRd|159ay zN%BRN3bC{%K*I1GKORQO52cv+XFH1LO6Z2@Q3sAK6jg%TkqRqKrOKnAem*B>mVBsg zmas}3>Vkr({e0BW@kKt#8=@ z#Lg49OGR-QB!{kgzE#3V`C{qb?X7Z#_=RaU5aT1`Z_>10=Al+j zS;XrN&k8=HyIkj{^B*u9W^)ftcEYorXwIP)5$itz=$&r(ofG+~q}tNO_H{D3dAlCI z=M5%0t<-KDUyrumyn5XgH!MwwWjpY)vXWP|m(5mrGH44$MQFmS%KrX^AoR0Ji;<(l z53kJFmU2_bhmFbPSV6X0%sfWa?vd4}wGtx*gE*lMpNM+m zEZfHb`<-ZFl9;T?&o8*d^Rg7~eB08$Px2iqLeZky4j&%>wyKN1yd-R6+AxP@2|V+Y z(dKDw9@+V8Jt&51oz3u{0?zsR4%vs$U%a`Qsc1IzMhe);Qnrg&9( zol*T?iEvBqCtV&-K3w`yzn}f`LJ}We7*^OtGmjQG-~JcA?Cv*c-$zb=vv&P&*Y^L{ z-Q&!UqyDpNli4;{_u`_FYb?A(y;u7!MNCUe#}@}Jf;|WGoJLNjDKz0fD3wF`!OWI{ zjz4a^YQ%OHygLCcZn(P8^n`B9X9s)f-$Js5LwTBV*NHu+A?re!RV%bBVzvx9M6Y(o zgFX+vBGN5A4m)cz8AT8htQhlS-i>_i=+!!BzGji zZxZtNwr-tqZ$rtt^WaHNWK*fk*)fu|S$}eoOU4v35#A~1I|Kn_*6efC#_e|H0NI>g zC4=E1<)JcNDGMui?2*-y{{z!2BjZgoZ9*pf5Z+VprZ4@42;d1)g?8B+JTDBK&%?}v zfMeT4oV6 z{{FpkqGyZ6+teq3+}@$H#**KNketbT>P!jaQZ{kY}73bdh>p z;RA7D(QKT174x4jWo~z5cmUQ@#$0tAQj9p&;hL&nu!BKRJ*nz-WxFfyCl3ia>IJ^+vjoI#wo@;R!I%;Hx0mVsJ$zAcL*ZkO?Vl?h^Pe|$-TrKJ zcK)3(KH6N9XnE`itd84B(+JYMijectJ{9n)6s-dj$nw;Dms(*&x|wu zCbAxY@1qp^HU3{4NU|UQJeYXt(3;^BE`H-0-Doh*`r0C>eR(t9*j8DsV$!PdE`IpO znh|k<&)wGYN}o@ce)9)Y+HSI;nr#9hu>%I@?iukL=U$6^>TPAMu`mhb^_q_N`PX+M z3pbHn{w*IzuVo}*grS5 zr$_|zo!4ez;EsYx}E9rBB- zwT&eQoz&x(UhRB%&=`1HQ40L26jw(ic9LD51>zf4v5;IMWF4)f?Y+_Q2DXYZIr8fe zagNJ&%t*l$DJ!wLxzxMnAF6Q|fN707L@8?3U)i5`kkhdd$$c|y4<+Ce3v1FR*rrTW zU#sBY%xGJeB6K?eh#dGF>PClU)jNR2F4I*qwri~hM#}b?l~Ir99im-1>XKlxe3Hqt zltT&=IF%40urPzUuo+_47wOyZI5Gbwg>3OBXZ_Jl-;NXCe_js0xp_Z+K6Uxoy)nFf z;k=*D5|?hm#%Hba^C)$#b{M+^wC76(HN+%ws<<&Vc%r-aRnOyCf3_F! zaepTh&{mGw;5rDEms_f!O%v-In@5w*P$s~{M_go8Lh8br1w}Tz5F9*e1V+OUSoEXA zlAUFy1eZ=wplPAHd#uTa1}BlvYWy;Lx*1!q-yZPl=Ik>p{iRD-o4Qi^0oD>}c-t2r zO3T_k+3`bt(U9I|V~+$`5qXyj*mgnwM))B6kTS$>zcp1l^_Aq<1gW$JHXw$5CrQKX z331`v37^x+g?<<(remEKp?w#PCBgG)g^xCWME-R&53lzpXqb&kCz?A;-qnl@c!3(I z(=X}l+$M>-<+hp$ADv7nNdmsNGelDn%VHd^KWvOE8DEiPoO`!Mj<~X@GZ8x!P5hdW zi^iR08tV%ix){9lHsz3+chJnDFVy2?!e5e-!UVOp`XEj6i;Hm8Pxw>HXOv*SUetrtx0FesZ zjIi+>98!&h=Jp$YIz0M;>LMd$7v9>T-beKx=Sd`?C*Zs$_yWcyiT)eiH(k5tnaQVd zKD|%WhicwAm0R$?>5&uC+*ThM5(Nivp0V(vfOpw>?}=2-m~e*T#=iMF-`&}6G-k;5 zMbmZdDHVX{X$b3Bm&VIh^pf_eDZm!cU|;UYxFOKOl?A)$ED{r*H4hzh5!@U>cIt4{ zu^QH%g5_xlYOlKM>jX@$0JPms%OQs#d=Y)5PY-ch{2ycu+M$8lO)fy1?9hz+a3Zmu zo)96=hPg1;a*3KGM3Vy=Cb~V*89hXG*lfpsyPYEYre8JpFWG z6=~03w&ZxmO6|L&xv1^)=j6Vkmd4{5V3MF-`66>ljO=(~ixW!!d5)a=Nu?!01|^+! zUN-PlHWrWUDd+`};6~``<7bF0NG8}LuRc`s?)K{nk>mO**N;xIHI31%={A&|;|7VX z_fq^kg-QndOm$UOv$q^X^%VJOjI_mQZDPP@R!qh_Z}xxHj32Bm;ZH8jZ9vt`X5VM_ zn(mHRF%1db4{n-HI(0c5%OF0c=)6`aE9$oTd+1m;Tc0CJKDbXrBr>MIwKN4_gj8j722zIgre4+-pA5m>k>$MRt;=F ziI`$a+Q`U0#>?Qfc>jl`@bObbtSvedjjiSL6zt8`b%7-%l2u&&(}}%yf%kp zuM`mDa8$F_er{mRMWz*5WExTpe4kkJpvW@gyPFL+Y;=^6 z!QW&a2JSaS7V6ukZAM?0q()uhj1`LF%KC@|7LXLTJ98U>=&CIRb+rh zK%|W}12Q8=uTxZXGT{&V_s^(pvU;tO119GeeIet4Ni_*S<1O zq7SCYwWFjCf}+68ZGGDzP;g6dBF=sKu=sM}RRLC-cq{K#d_C`fkz*Fq&yMR_@r_Vt zK%Bl7Q_ym1+yp97F*e-lON|;2P*AU|B%g!24VF5YQ5reBWnU!0? z8#pc42`1*~+ejAuqXJ~UZRCEUx&x^mrO$7>*Sx9LtLuclMrqs+6$e8)DM0pTlq0j| zLRMdG9TjX>WFMLt0cCoH0)44E;)lEjd>_ORm`#B076Ux;g3KB!EAwY2d!;V%>uD(b zGCZ@7zbDPMt=|kC6O*;WtCxCc=Lh1%mNIoG7n^V4)!1>f^QchFR+A?L;3_Lze0bq< zbfuLt_0}Fv!Xq5#FwKk@Cvs3#QdDzU1z5=KK$5j;Qg)IUzH6p>5F;Gaz-EAtX&HSd ziZ9sk_QrBMdfw9Qc(_F0lOMag3*f7H9`7!zM}XZoArxZdu5oxL+pH9L>T(-Bri>-x zOlV(mO%RLO)}pk;=IMF`ZA5u#Xs&e6^_;o&ec#~a%4zD&$N%c4uN0D|Te;IFh(U@L z!RF+Re?D^=FkxJ*c@XWMaU#V6301427ia}srJ3nNMByT!oY<8d4kDX(tzKDw>Z8qj z>zAcQLdE;;zr@rhF|{%mAeyid6G?zRB&$jVmXomxSBWP-3N1cLWZl|g7oSz+rnWlR zdFLxXIGC(h>V{rjzZ`_Oea#xrYG6b^J}FfcQZ;UJQv>tb*c8$QTRah`0fB(BXjd93 zxKZHhF93gG=h})rQDVyc{x&s_LEvTIaS+5nnb&d^*Py^_!g@DOg>lp(d0%qjR!}ip=O^3=~~W5Y|Rc0>e8ty zs}k7p6XjDMZ|AT7#BHhWOGmKfN2YcQ{2A43&&dGFf~C#7aVeGx!^?%`onPF}5(ip4 zJid)PyjGLzi;GqTIjV|mi6y|h?y|1a`vBHub;{*|<{y|LG7LX$U8&tcFq5Dh-|_wg z4f2j>B(e$}`;`UZuvXRSSfRRZXdz(FWK$P?cnUT%rbKwvyxgv64KJ!yvT47R8lSk` z^dee0wbvbF>c~lUAW=fy!!mZcsIEPFWP&v66RwSzG7PF9tdTI4OmL2|=~R_x2h2_6 zT&3W)yXLW>q&h1iUZP*vP4^2_cEG~)rc+K5)PUo@swR2~9z4&SV^U+`vtd2!Mqhw0 zxqa8~MAJ~u3vWkvA71pHH!3kT?eUE$EWh7O6ou@aLa|@!$#p&sraw! zFR3mvgT^TyrjP8DGH+CL{pw1Ypt)2L3~Twf#5CDLY~Q#`C7p8xR8B=`lZ>jfx10q3R; zq~1KhQdsCoJcFNqKpc@fO2`PUrF43-K?{>Vg~SmZh?-^$67Fk-J8eljRZ~JHo(MU& z0gAeF2vI z^gftNEGC15_k=`4as2F3PK_+`?$Xu>)^%|HPR5qj3u3(~%o8`WR+#91m5G zWQ=8X$%ITO_xZR-w;*+WAH{?7{NWB=wKJI=QA^mx79j2v`BtrsZIpN58*Z_TvVZF}qC=YChDSr{s`fME^m7W1<%a09i%)HWi*qRBUtoFCIzIB$5a81u8e({B~tn6o# zK3H7`Q3d^WKL()sl0QRsW(GBr@}4XIh2~#cd@RcVWq{S%j5ll4y!CcgLCv5vwY(HA z2vg5U3q-BWnLD@sZP3hXBL|_U)#&6;Ku#|7F<@ZQw zK-#aai8SWzpP8Yhl$vrR6%>Au)T3!Z(Fg!C#%L$p5s^EZIEFX0Q2SISb*zgn?}fsj z9Q+gu`CUXCOV)j8@)r3A%hW=)cCyj50MoxVnku|b@pbX9R~2n4Af+ghNnf*=RI$zO zl1Q4l({egdAHE{l#%3X+DNQaDSz!D~G0RkV*K`U7g^x<%6c(^C1$Y4smN-gY$n)ZF zLruj@W16l~)=MZ73Uf^v0j7~Xn?n!8Qxv7@%kTJ#c+Z17m z$IZnbhp;^%e;#k0Ul8Nvcc@(_=epQtG0HBrDLG*+o~N>U*|cdh^5`zrZP1`$)l|o? zr$kG=ou&*^VI*ZNMPixAm@=44SxBisMK+f9ok5bA56xbn$vqbLVUI1Lh&={uj&v!qkjvEFd}R2?#Yq`cg}i;a6}&K5r>s-f zDeK@xl*e&3I24{c(LKCEGx!aK-2nMQZecYh6igVJl|93QHkZMgndqv`)$wot6h~{Y zpw?MS=`ejc`k`WIEgML5#GEa2DgAw5IC-RQ&P_d(G@J-z<_Ld{r2B$rKhI{}nwr{1 z>o4LiOvE|n<8(cA8g_R+qoxY^9~q37^R5%|yk-`A!4kcI!{$!UE$y0Mb>08}7>mTH zS(PG~(KNH?a|og!N3f_Ei?Whyi9{lid{q+|7AlUECk!&yY3t1O7sl5v+eF?UkICk- zQKau2OR4P!4I4sJC2YigC06R~>HjzNo?nMiIGU1N`LX~&7{+GigfXY)h3Qo|JKf`) z2I;AQsfr7)7FNPiFKLPnCm>&CCW(^RRDIS0&t-OU*9@{WyirySk@1^6c*VhlV%DtY zX~7%Z9z$sIq1fR}L_G5RToaxPB$tpr1VMBO(KHN~9<1TqMnJSgJ4f=z*VG54l)qdC zFGuB7%k!GC;v958!l*Mi3=14K+UmK3hZoc=*p2F$_@)!2!|L82@Bc~4m@4FPn)G@F z2~Ww9a^sOz}_1|ei(Vco;^I1~)CGL0RbJ9Qs765k};TY#g?rh8l4Sy|W~F!DxS z{C*hB01BfiiD`wEThj{yz`~G9yQae!z}f^xv&+CiRX5w4WhmxY6TKCUIq%e;e+u_g1H2NK#vRgsO#%_r@;Wol854@}7xFq(Aq4?qW zr~&^_xjt3WgpTf(+gfAnf-B*7FU~5g9UC`Qr8#k{O*;E&4k8NjflE~NtatbP?mB;6 zt@XmWkkpz;vJ$CHvS-$TW8t*D66vaDn~*&U|KNY|`^EHSYk$f+2l8<)vt3shz842! zaN!uA_TyIVDb~W-Y#s%-E(O%OUf3zZId>-_PSdlHjGAb&64oZ!tE~f3klURfUCT@| zr8ad6@Dko9!?=0}vO7?p0h+x0jhkFc^I8VRcUf%oX!q)*nM>sxRUT$zL-A6*jfKU>!gp`#7XQ z(D#6PV08qI46^RpdTLkM!5F*C3*k1DVpzay;(4U3%FV~GQm@h#BoZRljB{aBz3oN7 zuKqm&SqO|iNm5|^?=PJ(JI;g@^Pak>nlK*wrud8aT1Y>5Uv$Q~%(-+FRnj|w$|Qpw zTHAb;BvUI49@rY-wT)6O`=~Z9IXXL6-}%{6>bOSL@wAs)ooG@z{~%Nzs2rPhnM^@C z!s8*4O*_vS4O9kP!a$`1Mj({rP<)YyoTO#uD!ZMmC}eEW^AQf@JlMOlXHuu$?C>Wr zgj0QCE+i8sNcN06aOCtwy|tF7R-#>Z(r)fbtC6s;KvRkb$BUV9w~HW)YMPQ|Qh>t+Z(W>y#+Sy1S&7szvj8(3lLWZISKSEP4rI8{8o%D&Dr zZ<%d`LMZvLfY-$JNS>d28z22M2e{f_Q^yYOLy{TL%0WP-GQfM{Itm`;iespcz7)t) zEs7+&C~DI!8`_E-8w&D~*d!u*ye@r^jLbBvaE&}6+-qxpd-pro?yP)Q=ey5#4=}6$ zeY^e`KnyC;kYOW6jT!$I#&A5rjEwfcpB+sQNwC>88i&K-=zZk|9y5jh@Uasf+=xEp zMwnZBdZ!pjEj3M?(pjG8h%kKSD6WY@Bo~>pJf{`&m2VmA_yxg4!D9?_aQN468cxO$*R|v(R+l5T9vG$WtK$C!bmhzI&&Ed z=3;W5CX{&ntB8d`oLAlJGM8K5(QQu*JDOAs3ElOJW)Kk%Hi*+vI5vat?JIB zJC90A?Mm)Ud<5qk|CvLYf#n+=zwbQF#c;=yj|fcVTqpm!)HO}BnJmZ&i_?uPS+-);nspmCi>+J6 zN*oR&yktZ`L!>q^MX4B0xeAr4it4X>-8+X|6T-_6Z`Tz70GjR|!FgPtSS^5O_~l!2 zSr6yyEYn{uvV3=i-rg?oi`1n_y?UPvt41&)*r>XZ28(40Zju*?72mJfl)Q~QZAhbG zgGR_o+{QHeQg-JvdvjlbR{h3*Fs8>2|1fI&5(yNE5J{)6`5H@V3JEp&xUSZdSX*CL zNdip-l}!X0ja-8fk(n_CeBIUca70OqOe3mm54SELHZAjUHzU1HFIDN(gnq%(W#z+W zPnv7B6sMH{f5_KO0bZ^?r8zCVa&~%J096=Ux@ZG z%rY+fXBxD!WK!zlxU)`t%41B%JS@#6ZyGmw#!;SqDW22&b{*P&(?2--!{P|xyWaBY zTPKc0yAxOz3DL#j$`@wn^u?YawveecST#l@&(i1#e`=Q z`xVByDd|}y=UKPDj4gK1oN3cZKF8?CB0A-4#lp&ERxEk0UR&HcqmBC{4(ma%`fZaiP(^B1OXyz>UDpYXBx#HT(>Km3Lt{p4rA_|5%(ic{-|DH#VPR>_2X=3B`wjvBZw)4dDKh{TfU{2 zy_f?M>ehknd6E{4MZC^Q5w%q{+t^UUm!|t#@2qnjGuVxlnOg;Q$~`&oJzY4Nuk3uE zx4EU|gB6;-*W#QYnvfk?K~XZ>bhBe^N@fefM^!u_;7g)A>dl=5^e-K~Y1} zhV3^*2=1qy387@~^etgFBt_dars}ok@Ku)~d?Bm}iaTbvo>SrlUHKQY9_zRE2 zjHjDGH4#HZ+GeO&P*!P8q;P6z&5zQ)dikQ#%}ng(yd85jHkwN>&LdbMRo~0{yA3WU zo;9@EaCLFPLZQOf17qmM;l^Vo;3neur>{x0IGS3SHg{+)$@9gW5TRze2b!k*%)ohC zK-G39A2~_|rJ$}2r^hJ5j&dN45Hd`)uz=r4h0C3lT+O&r?n!)ge$P7nz#1#|ryF9WERk~%c?CiRS~(x!cT{>``p!H*&cNTxlh-v>KCgcijB(gYWa2< zf~M2l;_{dm+Fy76T@YOet+qI9E`3ca1>#(K9C-!m>Y#Yr_Y3xb{?l`jeBYMtC~VZv zW%2U%x_^EPKXDe5lMqg0WhpkY94oYH&AJVnw)VfloC>X`IqvlFkZvzz{8c7Y>-i+w z&dA@RNK-K~R6?{VI=v#r*rp9v(m(mWd! z4k4XR!`2K3cO^38NA6G@asjnu8fZ3BZKBd7B-F)!1hEsfJN|8YX!hdvp-!d$T$40Y z4@c=-7B6qFZ($*0qY^ru^<>MMe-G$ndgS^@k4yljXyz1kdqouI=jtB?u|DN;%2j2) z)Vk~I;V(2(+Dpmh6D#ERc0YuMTI@C44uCs;_PB-3v~r8dmb}fMSZyU>E3h&`O1HAi z<^+PeSwSDU;0sSfE@-`V+2d+&K6hL^z@-~TQ);Udg9XJ62|C$YSgR3xm2?|(+{774 z#L>N(d-S(|)6LUV(n}y_M+GbOM$y181G0l^1A8n((&2bo;KK-l^o@NY6Q>5j3u@sP>hmrXw}gv0!wenp9loITwO(O$OS z-rmr{!-$tHq)Ld1vZPTbOxGFPi2#IP1jTTIq-ciactMmDN~_T`|9I?G6MVTEn7vM~ z5iRJ)f404==mf1HdZaID6T0P*-&n2rwL7rEd*aRk!c(18a`Y0$4m`7q4VX2 z4U%pI#FDKUX+M+R^VdgucbG+cgt*V5b%{Ms&`v$bbJhy#`k>j}=4WaA*%liu)momm zGC4syA)T%}LwEK(oP15ETWa0w=kskWsoSHFIx4@m;@hd0b#Z(7_10c(9Z|~W?~;kp3rNtwPEy_(3(ujyWzD*O6~-4Ok&mfnAu?-L{Ae`;?HSSU@Pd8SM-$PbZh z=$I`eyJc>qheM%Rgh+}kX_+Eho}|uZOxmh;)h$LEWpsNCm$U#ax$5zh!$eP-h$Wer zjF_VJL8w!JdQ63Brki1=S!SDKZu;i=ExdDI)n*i7WkWjf>g9LGZC-H= z%3cl8Cc^<|hy*JJ7Wc!918i|_SpMNT(Kg5bX9~UEweQ{jEQpgRaUF%ovlaUUKnO-q z3@1p6W>}6FL`k8<@&Bs-dvV|3>O0*EBYWEY7|X}Zck$b9D=x5D5kEi)jfT~#U7Xhz zxz92aH=QTpQ;Xvgf|q8P-1?qD1MRyi14}dFGZrK5GL**@&s@yHj+jkWgw3AqYRlQJ zmbQ`ErtGZ*A}#w?kQE^oG}91X`v^;7P@08htMb?Mp0`=^`569Ope=lD>vh}r5If5! z-y43X^gE+XV>c16FD!A-z_d3({oUWu!2- zVsxb^HfZoGyb^vHv#xGV4AxRcL~QSlZ<{EZ+%cVnTusBma}{+SijdjC9;3xQPW)X6y0ICUPz+U`8=M1Db`d1hqWTPEwk+EX}A0P-Q zXBJqJT!*m`iDDvTiX)eX5g(%+)TUj|S2Nq%-?z^Fjr2D2H`S(BU)DGeaZp1Q1r3U9 zAOa!mBNJn|>OR)w*Yjvg43ph)tDXRM;>d|3J9c_ghZpJcF*#U$G6d6RxiL!u zCC4Vgsz+@7hHZ0ff5xt-?7qdmGcxW0DF!zHfc-3G!CEHV?Z;)nR~iBl!g+`yo~Wn9 zz%QL76N;gvx6CIcGUT9@%U2aL)nKT?HVVZvlxoUtS(%uWj;Yi?O2aI|8f@6IV;{~P zE+urn*jW$$)lf$}xOpNfB2C|yf;uQ{fZ|#xX^PTDLDWfQos@qm-Jl|;G|B}6E(bAy zIVlMs1-weTW2tq0oh8)c|95X_purj&ZnEa4o2je07V2rKgZew}rrB!OJ1}q)CWHh2 zg$EIUM~ER}@DvHsouNdtb95MXjS2H^v0~jl4jg;Hjb~_$_<@ihAsCRTr?4P#;&7pt z)Zjsyv~kj0L-A-m5>9>qqHR<$fM- zj?;Ff)0F9_Ws5MVwsMK8Wn%UHQyNY>Sm>gIlPD`ZR0Z`terj_lMb`a9r}$c)gd%Zi zPJm#;nARks!`@+$mXS@l2t39|pcaam>V6ja3r*C)G$(XK;;7{3pk^zvbRBBzBlc$i zAXH(50HQKVgkQWZ6gR#y+!#$htIuyo+gy$6r+p87+&+7Lp8 z2~QEENFr0HG&+OHVsp4WzCb8Si7r>3{Qd%cp|wb{5~UEzl(#GBp?g(DewrLZv#{Q7-$tx~ zJe?Bn{g=sxGG#jjyL?0rwetv_>H{p~jEaG2Tu7xNlF@5C?hYx&f) zzZIFjbey?tHr-1}OZs7Ut>HqXje?1BAifGKw%YzsM+YIu=h!ElGin8;pFWd0m91SN zxmE4nwyvW->(v6Y+ z52>-BCT&x$vd|1}HMN!1Y?2+;fg`8n`YsAxK4sL6$(nq{{HL#97;is(^Vjl!z1^s9 zFaMnscmL<{`WpD^Hma_It2?{8v#WdK`Z&9K{uTFA*TMfT$COsWDqq5lFg79K)8f#c z(dp=l9{m{HV>qNXY^E(C+p+T$yJgRQ9Hc+<{GwZgr~rgu1jTTIq-ciactMmD%JhYP z2_ME+sekPA6F>XKuYU8pKm6%0fBVP3{wx09*d72A5X5Y6vfvC>1A)TetZeKY2&8?S zYEftmmJ8Q*_g6RBn7RTmTp)~ySSlmrjtV8Ia-!7EF0_WxyCp2-6qF$F=mv9rEg7Pw zp{1jTF)%VQv#_#paB^|;@bd8s2&TTZFf1Y}CN7cs*PNu3v;i4|h721qDr?NR36s{E zGHu4JIrA1QrgdxKl4a{{u+b))ZL!t1|BtdnzxS4^MR#^@dySaF;Jm|yZ-Z|9gXmjWDOREsLYZiNCA=FzJClHJFV6V1foKg28|ZD`5}Th65KKd;|y)A@&FfQe?Q z`x*L^nELYu1u$F?;W{GXNXZC!94VBf%83%{5eOnhi58QHYn0+8NR%X5%J@bG0nHm$ zj;|R0666NYvZHT?KnMpBF$rmst({A*go2WaTB$PSG_)#Is-jb^My)#a8Z>IsoLXKU zEuaSLP{0XULTl_b-a!b`_y(v+FnM<1@JW~#Nn{F@MrSZtYz~*l7YIcuSxjZ}?qaF@ zP|ek&yV+{jySKe-^tA_Qv10P+49+|6mv_+-)?nSR2it}NZcW)gL4e0H1QIO#AgC=`SA&1@ksHgG3@a;<8f#5XGFgC9k1{I+kAfTJHJ2tqs8X1AecFZh=dlJU>?F@g_k#x zd=-NgQ7Oa(E1eS9Gj0(_9<9foPeHf}E*y6eW#K8Oe0&vDfWN}Z2~<%H!5V7>>8V=4 zYpWf+jyllPRS$T*^@8cO`oSA$5SHF*7`%~2VCmgPku}yB@+O)<(qxn1O*KWhKTU%- z+Z=ccEr7SwGO|`$0dKWckiKsdysfrj>9=-a>5ul&^tWU1PCEtDmXP3GbP3*7S7^HK z8cC>7;N5gfxV!GDj_z+#MpZ~62qmOIs*F@PR6#Zns#fW!UPGu|Csn_J(6~_w7iU}Z zW~r7fdRn&<+O|ow?;vz05W060sObbomJ}yPikIh*pokzZ*P*B+!1r;gKm`pk>IkPv zcyyT@Ruas$8>cP=d>dR~&lV=%`#@sEwzwcX6UIZ+%$NXTicADKB_@HGGLu10gW14H zd)m@C$8<)`cw%YY{anI+vYkE2$Wv1+U5_%17}JchtQa3YFcQ%qLc+p;NhBd9B}9WN zjwY>mx)^~h5ksgNsube&CyQ*mQ$v?wq{1O~u?uy(*^R08uqV@uHI^ABn7~XYIFVUS zb_#P$Hko-&Gllu4I+KMiZ~@C)7!Xa*nB0xI-t{aVr=4%G^p!*#zCj?iOma^$p0$LUWrr*uhkYS%QUbxU*ll8we0 zh&+xW7{$R;41rtKOj9z7poY*0J-Q788xk`qo>`a{D>dR6@>^%4pp6AGbVW${2v-$2w)Up;E= zghCjELCAyxF|fFl3}7k+jIs(*9heZ^QUAdSQtBGi>>ZP-})G^K`#9+coi6h${ zBgn%fWCELRwB4Cuj4{kI&c4jHztSvpu%1QV5eF~EB>GavIi3|xqE?%P*L+_bycPVU1{1<4B{y zl3a({(}7M55)nr{Nt83gqWB#5@epVX&CGO7x6*IO8HM}J;1k*mF;u5oKH{oKeQ6j< zI~|13XbiDto8w&bp;a#;xUzJOlQutONYee_c>j#_|ptD$lu07l%%8xWMr_; zCIl?@G+{S6BE4M8nxR}+BSN8~8blqgCR81-cI>@~9Zy1t1VV~8zG71ZZ@ZCfLqNsk z06rC=5C~DgACzUUth9a6o(&Qr3dG^@5Yixpo(*$)#^aIyO@gpt=LOdJ|036Vgvw)H zko1x-m3{3$V;Z~J{oLGUe#77M&VDQNCkwxO&-Y98US}-R2i>qjpAEoP5ILf!;>+#q zbY4v3|C|OkK~KZeMW9}Uw>uNj28(n#`WE2z^#@MhwEt!A1)%5`$od^jf5O*07)Ibf zBVaQJ%rgbivj}pBz%f8xgxLFx`1>Ep_vL&C_4s)j3y2IA!67_1guZ^HzX4>wbx3@J zlhi-`N+6B4e1>E&G@Z_f+UCs%k`95ZB6#Y9vom1!g0~NXE0Em)(M>>iAaHCrE*I|O zgNq$dVkgwth3NZ$`1=TRmLNSC$PNyYLjY??WM+rd91tE3xqT1+mSHObuz%f1d_9PL zy$F7N2z?U+5k!n54p$6!Jf1|n$@tR=WMF0^$Z7tm-TfXxJoYZfv*{E+q)Myzt#(s^pToY9GZcmyq z877I#!S7BjBgQaYQ)70CTMax~6eBo7;ynpy;2UT}Mby1`11PQ*X|Q*CB;Qp$%Ivj#x!FVz7zH$e_!}7{tg#N`j9GQyeSvf2oA%VlRB` z_{NI^e|+i1UM0O(a8xV0g!J8pL4r4yXT(%g=rYuTF^Gkb2)$*3Us2gZl`v%N=PFV7 zv5`nv@r7A96~&}lkxf+6oCRmU2DB-p?-GXG=X)T5+`oV{E$5Ve#zRTr&2FHiA8lp` zmlAJ?Scu{g#WTs2=&ZGr@%}|jI7Sh-aBBm3Z4lR0keqW7Efq5Am>_~6iWi?5?~$Yx zG3~I9>+TwO4X_P7L}rW;87YtNhG?yjv%y1)CLm02^J+d%A5dS;mYod;RU^6Dq)J9Z4F~W_*Fyw6gBBHZFBPPa*&gKAs7Ma+n1Dl zL|STxW%x22cbnJ?mzn1H!nmPVp}ZFAY>NC@cHBZrH8`m_WFRr0|!ADEO z8|u&0WFa$Jw`s2Ku%7DB0BWssTGmi)=xOWgXQ@7r?)o79L`b)_2tkB!7+#d1muMX+ z1#K5{P;ywI?3F6if4Yz*?IIc3HJ$319I$r`S1D$7OdhoIhH5^#jOMqYK(4k?BvnoZ zj&7t*6w99v8i8D0QgL?W$jxN0wE@;9{7@vj`Ut#5F7-kXA{>UdmY|nt-EG8w*oF-h zM3F>EYBCpcq|hjnBcsZ-S_LLkHUCc+_CXvjN>MrUPF00m$Y&+rcMPIAMlZ*l9M*-P z=AFLsvFdPs8w!Mc8*x>up*y>fSm_SaUge-xQraD&5k3(V%aIwzvcO~>NUu>EyG8Lr z{(VtY#J{YnxVl5JgddE@*wgCjN3U}EpsYF@z+?|HC8s!aLQ_4B8)Xy|Ggz6%mSb2M z$mWw+nMvR38hMnlq#RKutIk8IOlA+WSsBg_$1~Z=lT0vaM7_9mYGL&2hwLl9%9N50 z92>eYQ}@fjs;dzd@IJwOH7>w;7$!E#1;ObA9S-3|yj7U#@+_sz&V-F#eZYgAH@?21wx^SUkfej3Wz0AS}rYL zWyI1NnvfGxLg7@2D~aJ%OxooEDJ-P107apQujQexKrw+5sf3o7;&%d1Mr$-_>IgZZ zpq(m_BQg90+qJf1MvY7(FEVa2Faxt2NRf4DGDghkFaut;3l9wg!;M79xS6paW5hZ% zhJn2lc-A56D1@@6S|ev-ZA@`eyrp1EF-ElptTkOBv?wIS6$Ken9Mh+>;tfTu5TaU< zg8~4M@Dnz#YX(n z#oYJQd=T6E)QEtoA^ewv55nEQsYCIlm^)4rhnm)?7{q}m(gt%h*3i`P(c)uY@|AD* z>+jf)e#bsRivh3|{Nw+f0k0J`goBRp2GP_-~B6qr@`!Qqe?hm%8cNVG&aM2ExSkR-<8;Hmij=dE|&79h-;1rsf0S6OhQ-IX(V5+@WP@fTnOcr zKyuQ=Pd+D!dMd=Eq!EmXp;S|On5maneF&kVBkMJ)5e(aN=fL(RvHpABs9z@sncMrgI1Yx z6`6uzP{%)1VN!_Zp;x*Fi%wT9)kVrUB{wl-Xag<~~OP&H_;VU((+c-L7% z!cbZ$qP)ZMshF2k960T^xh;}wwQwz>woi3dk*r#@+9IfiQ7lHbomKPKt7DZ_+pXf; zWs_Blc389r)&5pb`yHY;k_fL?Co6*j_!`v6pPwL})*00+T9hUPgNIE9^sub_5MTl? zC#oU2npKOCl9Q4fFeoXlR9Hre9i)xUxM;EA%7jrvS{!yniH#Qv(@nmBgD~fuuQaJw zOGZIPA#~5TKpLnf%B$X#-c2c8N;4^qn^L!w&Vs-&2p<){EzRO>n|ZV5SINWd>eG3Lf}_!<&u6WndPT1yfX<^%J zjm^{?=qc$z=s`$G*;3K#q9><^q_=^Do`N2PeUL6-L!G0u>Df`zE1{>RqSr-csjP!= znrmwcD<+iMM{dQC6{S{`5-U?`yA`=skge#p($rh8(}6>yCM!zulp@$i(aQUuQ)}31 z$O?Z0#`GCr1P(?+A)XJ6U222AH8Pm4I}8MUb=F{m@Dt5lnVvSkO|nHu+uI~=0%(r$ z`pU-cY8C=U8uP?S)Mx;l)9qh@6I=tg0PAH$Lklr7lxQqF z3^=O?v5pNVp1wGX6Cw&lh5}`3wCFM7wG_wB_%|@{-cNvY!1urv;10k7*zy%CQ)x$y zdJ%0p^@tlXDrLsP3pTyr)5D(HV3ao#LHTtp7XQjDy>N@D3QV zch{kI2M!N@0-n=THzqU~1}#hnBBe3aQ?*XWgmpRw+i%+`=O?*4t`xHbTloxT=C-G1 z8B-3}qT1Yxzf@+6Rw>`QsxEsgeiN!lRaS*adHL5@BPyiG+R8_4$3Z~anp+aCtM^;r z9zbiHZ8LVUsCEq*`mnY&?c24Z&t%{j-JVF7uqEBLen*>-6hjXK44Uqs`UAfcN!v)F zf(X^#4y7BFwZ~6et6n1~H!r`SFr}~Fx_x1T4x9R;rK3cT9Zw+=-P2FP{61#V9tTJFiG-MYBgxa zhW}7uq9Y3D75BG`giFall_5ty!X?XBrOl98n~vOsg-#?CTDOmk2O>?45erUyMMzPg zTDxI$wj8?+8(jejuh#9O;DgCfXUvi_Kao-us?lM@ylp4$!a+9-*;dn}V0#dtSAk+=C{eH5xFvg#&;fk` zhQzD+b$@%*6lnXwhMORr3W5Tk1=K)}cewT21{ns!_X(`fW#+HX*@v@a^(r3!5 zzb><+5E^KL?RU%tyKM2FA`-cUP!2@#8?kn_KQ+JW|FE`0`d4y()gpFmxz3%B3=H@FNecA+tUt-7<9SzH6Jkt zknJs<)mU-;)|J%=9x$QD)xneGO;mduxl*O^zONw{JR#d!m}BbUJr#9I)&y%P#IRwf zI5$;S+EMW3^a1LysNJz-imJn|0j89<+TN**QLFBo+%Yh>`)6G%EsH!uhv@V4AYIcF z^c?-FIsjM6xtl4$<~a5DL0!EyiOZrQE|MZGvLY`fMNyPRRm{LoeFL`bAn5=f)ujEQ zG3cflVF(h$(;iY4#Fp#IZ7y_f+}jLqk%TG%T`F) z$zBd}l#`t0B9vU^2DQ@(L=$iQM)^pHMa?6}ME&0F$LH7g&u`q}p!$uW3XmfJSr9kq zN+O<^&<}C-9p3j5sqqU;aojh5nHqsZh1I9<=!ZFIvm9b(YHujUi(?tgo+d^QL!>r>NIK7rO%KtQ|2vO zw;i(sN6y$mxeo>-i6WZn9-YbR&okn{I|QljFN_)bnOpPBf`eX1LsJK8eUPq8)HZmC8I!+ zmJ1gy9uBjp5%8f^>dy<~OH%{^;AhqC1$f~T>asth3z}1GvCR&jm0xjXRg#$H%2i{Z|j#FO~IuHLsRm# z90%myALim^wCS2EC|75h-cw=PTk#)0fQ|INoQft`S{HR5!sTCinE%0SKtKD{@BS?Q zejbQ)<+r(59+iZmD%A+#gR&VHs2~PYwK+-fwOI-K=}_);D1SPXLmkSa4&_pZ^2t?dvMz2&r7!-@kn*gCHoTFIZfxV5 z2>%qg86YhCQkPxzM|@&%$#R+D%5|bLucnL)s+l`NYTI5Py2_~#oP&T7{G&}Ra8D6P znVu<9dC!GpsbhI+QkxZ7Ir^P_33B%pV;GA17z17TbeN}-P3Z(Kb|eVU1)tK=JsoyP zAUby&aJ4#3qNX%2u@p!vZ!t^cq@_`uu^cw%Esxtj_ZN>}oaU zC+2o4T?|2DjU%p+u~Uu(y0OSG*4U3944G&WNhO==*&uW-`c)ooot_RK;e+!7uK-`TH$Q zlsE-Sl&e;+S-WoihK-xCV8w-sx$bRUQC*pGqGf1&GK6Y??U)pL7Zt7g27+}UqNDd3j1cxOVG%L z2SOFVTJ%tgbHQjqFfluYc`rhYkK(0}mZsDl(nnKEot(>ZRQM>oGr<3lz zWco7MzDus3_VWE5S`$|a>sJY<9#zUGkjhD=ddiU=(WxDFhJ5EbR{F!h}i=CR3w#f6BC38^@MLwC0whz*sGJ1USe^MpK%uqnQkw zLL>*18B~qlIpHasx8*2A4(d$Doxp@jrbh1`gP5|az5sv-OA0~-Havm>004j_c1j5; z8Zo_nH2@GXiBM6%Q*vR$O-HCO;?8U8<=>40KqL_=uo-QHZFf5{u}$)tH6Rb)RSc=f zN8U965tay56WB~*Z5#l^?4B=mSyu=;avP4IN+b_&U)R25??}`!jtPlSH9>*dOjo5+ zsZ?F=IFU48hYUA%rTkm)X3j#f{U9dMU zL`jsw&q_`O>VnaC8)Iq0A1-Dr@Gv6y{ zXGeG3?VcLlH*Ujl5sr_?6uOl%Vmm;wJ)qbwP}>2`_xa&;sPeK(2mKE3{W*uFZAA5{@W<6>CY;lHVtBGhL3W0zq z$)ps9WC)Z7CX<ct*kXenIEm?1)84a4OvuuOSdh}VbYPU_g_1a;lUE{v(*LkPbZ}QHwM?Kza zVRyUtD0Fp(cf1$N7A69pkT~fiG6|BvRMcr*bTZJHSlBo?Wy|Fg5E8bH9+g$qHMMn7 zXe^#ccCJFr<*DTR?7CpaYR@_~0Lz?bv_6p}0d9E)0KkL@Hvk|2XaHc9*IpY>VE(t} z|1Ka;Kfb@nc>@3*`(^-4sN4<1|G07hVA!T$fc^h#%O5rlpnC&=nifLDAR6?!@Q|Y> zc%NF=mLkilqUrYf*TvDD=)v#(InQ^2%iPXux&E^<7@WohAKSZ~$m+FY;#05)+s~6| zjIEsv%&=qzM|hy3L2IcaNm!2Dc^hb~+19lsGAXmDw7Pz)cAaZCE)rS}RZ^Q`%4k9x z`jmQToDS2?G>pd3bczCoIjn#~3>9?n2qKV$Sy+bOkPk&r3YAa;P0-4y7-w(TewM@v zI4NKAXFS6DqyHxHH!1a92bZq~YPc3_drVwXT0vD^{g&-I^^C%<4u^mO%F3_bpfS_t zZ5lCV!sO}u>?!xy)12$H|=>}+EPTBl{eaMe>*?w6S;9;-F$s#egIfidz=HAcT5wS*j`Uz zdltXU6|Zb{>)7#~-Ob(Iqdj|?t5I2g-uxJToZBAx$uup3onceglgjQVpojtusiu#p zo5tu6U8bQl`iY(i5Fl8>Zbb<#oP^$Cg-`+;Amy6xn_PX(?QK5{q01;xyB3~BeGM-=h2XHwbKLDS70pQaG zfKPt7%-UlD4(O}4kF%zD=c=MqzUYc|nGG(nSgnk1C4cTzq zZ>P>6ox5-uLrihU)8qL1kTzZVNa@sHvQ+5?W@&A^i!7?>imI>F7bu@xQLPX(!wW^w zSC?R&!gY()V=$I;3rL193)%gYo4MND)#s@(Zw+~A%13MdTJqDJ zubx767ow|RlO-7|-f%G{N;F!W@e(YTYqMh8_N(x>DhE~i??ib{rc3qNHNT|gWM-sT zPAS}xBm1NtD?o2yc0yGB(>LF%(rYw$XU9@r@-gp3q2KTay)> zf`Y8%XQ?O~#n~#!PHFZEvsT$J6*;TURaGu(a`UGYQze@%-Arlb%QRPpg|e(yXs>d+ zmD#G~%U(L>(C~5=*Ml!;dHWHNW59@by7{O5QqzJdVKg9o1i!LBEB0a7mxT?*LUr{a z4AciO0}}%i6LR6kRe&IYMvNI1E>eV5>(*@Aw&m8nyFeHW2EiCE<1#Pjaw^k@Om10NCGL+}m3FDzSTpyY=J0uTr&ARvHcs|?l9Z(C$hM9z^jCmy_b^5Mr< zuuvhQ#flLxQG!Cnij*pYP@zht8g*(lXws-fn^qmVbn4Nk*MK2|X3d+kXxWlIljfW2 z(2@U6oH=#r3d(iFFp?f+{(%t`zTp@C5fI+tgP>giL+pgW{BViz+%ry__AVl?%22}$ z*Qv%v-bN;px~imA+nH7iFfkZj;5RcSE+Hw^69p!iW)>8clvVnDR>U$^oXehkn**H3v`_8t%fjm)K}5uF<>O~9$zl-f z(MABETmnG5xQvvmUnO__YSv``0x-t^4xq4A_s1h}A)=@{_0QPHZhY>4p}z5K;+`KE zuHPUx^u7OeqVhvzEurVi^8KTB6kUZ078xOXK48=q10%R@#MY06F5DwRY|6<&>Iwm7 zo_)l{X2w|yJ?UWh>gAqS7?htc72IsaWH_!Wet}0$zr@|kh_ANcjuXw<^zDde@&F-N zVAc5B2QYUDNVMyy%PX5eSW<8m@I0(kY%chg2KuVbW8DQiW|SIHr!4ohP{LUiG-UjC zQ%kjm$=B(*0a$e<(mhelMzcT$rL;D%P`Nx}2uQf9EkEZUS?y5Bn%$(Qlr-dUN^Tg5 zc=JR>PQZa#`61Y&qooSoH$M7~f+2w?A&8APkkVD+-asA@V0B)GE-!%%$G);1BJWGG zH*u;| zFxaJ68~&{Bu5W$zTiyI*FgKcNb|tz{gl4u`C?wR7%5tq|=g8a$ISFT&y)9#~AL=X} zX|vMVPy9^fs;-=T1vn5cRpcKf^J`f)T)DJsg8Ct6lkx}X;W0x;RqI@nM#r#3JUN5@M4EbC`u zb4T&zCsn2OTD7wpRxgd2zO6)Oi@a8KKguX2@%j}cebyH{9SVT5(%O4`DbZXW8@8V8 zm1lVP%dPFtO`{P&;S^uDM6Q6;<52 zmKZRvb7ka~6r_SOLF>K;YzrGMM5%I?_mz!C+w*`We!1r?r3|)B#Tt|iJD}^k&E}q5 zB03mZ(dh(9L4X;H3DgCOGIkVEWbBbCOgFW-#wZ=-MyI>YCf0cU3v_EIRwDEY%*cjZ zuS=rqM5HF^=Si%k)vB4TMGUc0d}agk?T$*j3Q*tZ&$&wUC|xpkQ25jM5f*Y%;na-L z^{7(AB}T#mNx*=Prgu2T*j)79g_^TNYAB=M)u*wkioe#@I(Ag$Z;!CBQAnYTMj|?U zPDzGpM5A*+kTUUzu8c82wp^g zImByGNHeQghCCN~wS}-9UdY%r!`qvwmpghhfQguN;7zNJZmSn#YQd$E zs^~5F8H0lPs58hi$~akskI*kTFH%#x09zBUWQ@f`t832x*#moz9sLCAp4BGxnsYxp zQANN#Cl2>)QAQeC)_=mMVscJsbhoSjwv<*&z#Rq5G4CNw=erg#Un8=6S5w*!rtx!e z7(=XSBaK38DowS-fgEih9rUq85`;v z((xI0-M?Gm#bC6+xh;-)Z1iT58EVL7&m1>q8IfFrltp{$?VRxd3MABrZrFo#oFbFp zB6>kSa=)Qgu@Z$i1}$bsLBhk)F5Ud(5`mSCz&1*1=h=o7W!%+W3b6gw}0$+;?7Hv=Hr z-DqNH)}IR6a?ntLEE#I4)eWu^o=pVfLBbQ_$o8LJ*H_Dw4+6S+m?G@@J0sNEU-RsV zRdK8HSd;9h{9QcO|Bl&xG z1SkoM*8}-w-r2^m;;8ymlx1$Bbg$mhuX0p$NMwuFx0=nE^8^5lSB(gEytNJ;xcMy>bv(ip^CAl3~Z?3HI6*j_6|KZ(uGtQ3Wc zS;)8no3&w%GcUPvfOXa!u>Bg&%!l2hdg_TcYohd$e-Ca-IRp5UK`v);icLPAwdnp> z;YBg^odT*;6Jo2M6Mo9P1qlbFQ%*@fS%f_}#hpCOffm%#R%(l2j9SHzC=ZS_u?BwV z>Nm@W)}$zvI?I8F1V#53t6o+FVAD!vxn`wVdy~QzLTM{Bs4=c zI)p^+x#M$<1MT7kYq5aJ=Zul?Qk?Ir8zQ&;Zp8Ox(9)Y3Cvg^JQtUtxZ}@w|s? zvFJ=usI+@d3%LfzRcOkUIrfpH*Au2fBP(b5rfCw3m2e@)XJQAGY==PH z{dz;8Ivyg$bM_wYKq;PYh+sBMqQV1d-a;M-c?VM*K(VOa1xe9R#yE9~N~u&%x_~(? z1(`zUyRrk-i#;uhzYefX>9A*Mdm?piIHg%&`E3oaDgfL0weCxcIw(0#2^Gmn+B!j@ zNEpcm#uc63zU9K8Rq~+6t^|4?7Bt%HO6M4R*BXl@r~_v1Y&Z*P#+gE{2-e4uUGc3p zy9taQP9OFmjv|`zUi4n>S>MhR<+K^5IZBev_^u<830@%0Zk-k^TMf*hgfn)o?Vfi*1g~ zFxNiEy9CbBdXx}VU!|fhKlKnPKv34pWocy+jOSOOP|42kMJAAUD0c0W52L#RjiVRl z4P`ghHGq=6pXJLow*`#u`oqL`6Yu(v_IVoulR7bl^VZasAxw+!`_(J@LO+qG8z&0g zind9ie2}!#dGWI8X6Wk?1l}V7zI81M_RVq92`$ojqWVIwPZ*C zryejGzSbM$v>bN}?b2{?U~gb~(0um!uJ|ot^3^!XPtx?xlkeVk29{Wi2P}W26K0l` zlbOw<)!|Bzm$+&8T5{UWciQb9yqz+G++uB{ece01mMpO_6m_7+Y`;|W>@#)yN@#xd zC;(sN+T`p4P-qF^_~t;*EYNu^Nlx3)<o%wA59#fdm?T?;=W<3M>o-Bo)=~b*Ih^ zn9KG&$-8?dpVlu)W5#17@MArGPHbA1^^v2oaA4$MI{0IttR8PAiMHA;5}PFgd+Tjg z<4t^e(e1_U6S7GM3f$&T+bd*D{3#cgY9s!b0xDnN9CM?Ht(Z2j4WX`@D_`7vPo>Hl zn@#R52A591^e)^3NsN2Io};>)pPXhJrwy}5omkEKVLGw<7;4{X4X34YJ4lAg`7=A+ z^N})dc-!)$vXdP?`)>@n`LP>QvLeBiqTks!i7t8VO0;nY40M*~rqzJ%`)EsK2f z9z9>_)5DIlsf2Xu|!+@8&` z>NU4}ULGL(&j1nq*CVB==lrq1^6(M9rx(R<=<<7?MPq^2%Tck0(+W=Ywh|MH z)9mtLwY|`d4m4Pe7o~q!jcS4IV_wET;{eCxI;#q)fhG-pB;*XXFPm0txm}ENBYkn| zcn3UIqG@P{fX>fR(xkkhmq*7>CC?p!0@!&^3Lku2!`Ej&iB(pS*=^lI59f1b@I|N_ zDipu*8l;^{E|!=|w)WN}7hS!m_3`QYKq$Ips3B*j?Xv2~_@XiRZss?GlI`dv1fMk%} zrF|<}{RBCWP44Mi95E}vBesnTumUG3Tr5Gu1@0B4%ZE@)M*+QR+oz1((YMlRv3HX2 zap-k5fo7><(RQf0awuLgs@zB~fW}WL22!<4H`jDmHHj}cO{)toWj>ATu8q%zD}bX%@n2$?oOt(rG!Yli*{>$QdAA9C z!_J$W4|ZjjNV%9!?@1HX#G75q2cZO+Vxl$KfOUeP)_pYMx)VYxWTu0ogCOeLwuMhz zDA>^>9KJq8pO*T^s_k96@T{$sLXDMrs-;HHF&}b^2Etboc|x~BsAxF?s|`+qjc;g$ zA_JgSg(b`b+Yjj^hHifgk07JOLWJt;?elYgLxG6hUaI5yKq^s%Yd3d4P=m#8Qg%6K0V)99t1<&FMn zuYMD!*&aI#G?M#-J>xXUeW0rTbEvhnk}_3W&*$=WR4qtOm+G(3 zkc0R7#}-gHj8J>q7tmQHX*x7IvUDS${{`f>uT8Zd5>a z0SXi?Ah58C)`gg-qO7KbgwDNvp1za9EzWMa+#NI*Bl$BypCf=3(R_ojxk_RwbKjCwv6j2 zjLM#orBq}fw(DMnv8SmNX-T}28hn|C%1?nIX3Q*B#vIk)XMyJbHH^dAII>xySRfRq zSWDTT=aPc4!j*yzJ(nxwWKv_)YMy*QxAD4SddNR3kR{?uh|e!`N8KolpfUI1sP!u? z-BEHV%jI+%(e9vC+s56!aD3h+*o)_p@yD67@O=-l~i$pYe zu3wQ?<&}x_0|JbbLoY0=O6ZUSj-HlWAhQCkoHW2q(uV(z3D!zOszKCvZx~JPjwXJ# zo*-OMMgfaEZqZzE_Eyki{@YD_^S}JhLOTB^K31@Qv3vg=$Vvcqj|PQ6LagB!IM^PT z&@{YmuQ(@8e(Eo+o^eJ{aJcy_?c2czH^hvz3M7~I8_tyr|GoMrrpj4cgEpVB)qO)o z5!J&rScjWSH#Mr-3^*IV>2&9J_nF3SHId!S0fJP61Uz2=dx4b>35n6T3n!o>OE1>k zCUFW`!;y7EEY@Va@MiI|vrv7W^Hcmc+M%KGpWX18J+_$A){miURX0uf^pjC)Vtw(cI zo1f7n6)iNH-2wW)7sVTFfv>Lka^2lW2vyxm#9d2KP}`C8dD+-4H5PaQq(uAKUY!`B zThA6u~bGNJC zmaybnt)%f{Q=q}-IdM0+jTqKCq#ZsuWFU}%>21c^121-UMcOb*9s1X0;Ow&Zcxx2kh; z^V}~;8Dv~hAAQIlQL`1e)8-Fi?)C=bt%8hlH*qQvMS@JmIjnU#V8>Z#qkc|%j! zoQInWuyaUf=DHXeQ~%AgH1WCl4S?nlZo90_-Mu^WR!ok)v*Y;)m9(pUn&Z+mHR=6w!Ns2K%xu#&7}}?$hKIxYrSl3d{~oI zjPG_A6sj*TkhM^M`ep-oI8V;QZ-4hkBjLdEw-8xI0M?aO^@f<8-(b@_S6>(b6YYUB z4;3%+P$^{sMTDF*Ja2Cl)uF65sp#z83ReE^esKa=cEU=0~lE4Bp%LS#i0*tkjxxeb~KHCjqT@DQRo5uboCJR zV|xehJUn{jp+SupW$*6gZ%=96XUxFElwN0+>pJA=w)ci0=Mq|0>&|&Kl7Y2oex?FW zK?wj;-lk*Lm3#YP$Wz(taoSR#18}iKwdK%~#S8X<>KoZxfAfrL=`Ns?Te!j5Mwk{JGB)$Q zsHaGXJHpzX)IHejV-&2V$(Rc`SW3k&tL0YMD-kcd_`r|=XQWP`2)h9KU9!3uhc{B_4vwrQ!Gx{!)H`H|nMll&CPBC>@|mXhRYS(Y>m&wh$j%=# zKOtdAEzsss!nXQfc}7!!n;;+!0SRlqIB#ix|08v0HMhqmDXTJG`R1|H_ADZxEGo+v@Ga@kVul%%(v&^`jQ>%BpHiNTLD|SzNTQHmJsW#Y9WW7BcWkXrJL71pbMLFpVw?HlDK`?4I zkdiVM9B1uH$ycp*PJen{8IP>o8@*2>!hlkohrZU9BZBd$83rOFw|+E$%bZ)8g$ zEtXTo+$-qC!LInfyR-C-mHhFFco^4$^A9!bpweT|JPTMXJOdSju*NFU8DidhD!OJo6Hu6?hUf8yfhLzw= zK5n!r@fIU1>>8<-u9xrm)X6kb*;Xtz$wYs1T{vgQxMI!9m$bw4?*cV-lVtv#{kLkd zKbWu;TH#D;-y8Ja^-0Tz6XnC`EEIIWgoWZ4)|~rx8DxKUo%Yk zfU)(R^xK(RUx!vHCyr0AYVW243&g9Ns$Ol5JftEV^8EMz%L%|U*l5e9-%PLZF41g8x=bw9@l6-<4-r*t2~W)w-vSK3RajZ`MmNXVG6w~$n>7`Vb6W}( zmL-{cw9;I$29>+)^0-1g@Arxp6EI{QumPUoo7_>{pk2Bnt&pw^a`)mqzNlBwUuEGl z2E1OzfQ8pzCGY~C;e+w!g%RnGrW*#p3j&1RX}9o^_pU01N#Mxn>7{AxO^Jd z@!g3^ZN)D_z0)k7WG>(pF2-TFOH*}!w~ANuNIYN`@C>@(LB?cABoC^7EQJC5vi!Qf zc|(PEVF}ch0|wO~=$P$7p-)`ODG~>FBfR}?U-{Lep8DWGr=3AT_VOLH!8G({Y*@E9Mn+FL}rU1_K3-HJX z4#ThceK>PpKuvSonWHtT*`|f{;nvD)aN$qZD$aU%WwYs9uFuXi zxI8hOUjiMx`=IY>_Ipj5fUfBl#m3|Qw@`O(jIdUIFUtGgTFLDMEvMYb^KMriou(J+ zEU_iFe#4G-tFp=pjYMbByX8E-lZRAzZF@s>iCHFKnk?+TCWdN~Z1+`YEAB5&t0T6l zYRY>8{std5ekG+PzN!G5m(O0`J-JifPLyvOKdd_~W5g5v=HdR^LE*pC$ITa9DyaMa zGJG}r>S9Mmi+)oNqscUL*YdW_$sNf60-yLK+oZhZfs*)a{xgXgoy-=c z%Cdul6LWB3zv3ZxW6`+do49T%gQ97rqTnK{pC2kyreXP_*C$^{BTAW6_(QL3uEObg+;!@ z86uOX<;rQdo72+@xy;%6aI8D+19y=uFbqi2mG+?53v7{`GL}v*SB02(ogv7U;ZiEl zAH$Vum$MTXP?_d|*m!0fm`=M~x-c?3!;&;24@c$Z)nwRka{Ipfvi9IGD_@qqUv6U&}5RDNUPCa=UxQZ^g@PL+S~be#D`%%I{gKE-`Amf z{sZcR3>}qbL*c?tt&v9A-H!wR^hU{wyXM-+yN#qX0k>Cn)m)T|z$$=pi0 zc%pw~vnrFfDGaumms%v&=_;V1Zk1Ifl6f^)qc|?oW06^=);=axqzj1 zh&1+5nIgG3Sc+uoHNBc1ik>f~>olD`0+jW(+>F_GhX5qPSJt1~%W&U?Xh&cR7UA)n zk?a`Cyj5sMT71;8`Q|=^G%uwny+q zuwAn?7AWAR2CgQmCe*2VUkRjnm;#w&lw~xIvSbbcljfm4?O&%Ns5Q}9uF;9PFqzC{ z#4wjpCUaqWKWtR-xJCtx7!_QeQ3b-Os4Wml5~{NMIuwuizAc(IGJ$7xuNu{K7euNN z)UwAW5%bP;1gO#u!&ZHi$8`b@JlYyioS&#toU6^Ev2_9Yxmqbdzs}5Q>)SOk&LoFR zj!(Gg&1cPYQI(l{*v9L2E1mB6Tquo&^@EC$3c#V#)Ms^$tu|sie)K+31J8&Z9dm1& zYJR9~d~DRQa+rBFS60!*-Md= zRo`Z-ZznwUE`aAKMV!Rdd|=lA(x&=C{p2VNa*8gfE8rhauyg9-L2$b?^`RiDicH57 zJ~ZeI;XmVQ_Ey&elJpJ4Y66#d9dS3oH^{g5w%j~Sz8TD0x?YyH|uJe1fM|0LzW_+Fx)F0vu<_2p{qG*gFIPG$RY6uTJS zp~g*Z#)l6F`C3Hc5Jl)xJqo~xjfESRxgKHpwo3|lS(&av^V_2#qnSkUmJ#vCk8XE6 zd!!h%depgUd2u9+Pdf5qpT7F41QfNnYsG&natm^~^%whU(Q*+u`j2C^&X?X8W6NAu z#5u3k+Rm>pE;)7Ln@5Xn&57oQgm{1@&=0HcdF`p2DjT0RVH1-9HrW3vdmjC~w!(RC zbD`3Va`7fhE~XUE`F)~=7z|g?o~Ub`YEYR7FO$F1KJWKPYG)+QZCOZ(dnW_gI^$)I8{C@rUoWj z(mnXv_C0Ek_DyGOS@mMv)hRoZ;aCT1;c>Z>qZ7Tr9ZYp?yFIw}-A{3M=wT^`hBbY^ zyVNPGxV*d1*dhVOeO(i*u$n))$1k@Uly2=A?`&x`B014O&vrd?t&l}k6ds3Ys)}|k zBZ_sZ9};xjlMNSH5_Ra5wak`nq;R{XLY_YH9`$e~#5KJ%!J0@`K@N*U6Y^&RI5iWj z+uk%o4V>DrY${=HahJh+bySlntCB9d-Ll0rs^VH`8$o-z^|7poDTLh12}Ko-P(0=g z$yK_P*Q-l&nzz`Q1mqt3y7nx;qf@n!^468(+*n279q6@zOTMT~dPidesE0eQ?ya}Y z`h|zH)C5}ZC8Q`&#C*quG~@a znkbqZ&&^H^+LiXfkSD*&@ul%Tv^;%;sbl!&NQ}(S8BDLV6?hLq=OS3t#WOr<#VJW6 za%&Vg0YeYRp99ZdUHHtd#DmMj?P#BbGwqyWZD_ToXAwJcpAc}pVP&37U_KUmp2G8; z*7cm%M>lLc47e)4B?RdjgfMa$9|5=OOg~?}=l>cand)H%ku=1SH>4Y zlM3TvHqD`R?fahh)3YKu){s~n@8PN&S-jRf@wk6O-S>4(!0;l?-T8282|PFatw7Zkgvb;@-%mu9hcDwnMmX(xQ4>SC|PlD!LR`fDxAWHEz2 ziRwHhJI#_=$F%ZAd6m$u+B=axMU7^Yu!=&+J!t@&?vjU>h0;Sy!%**N*&Y<2A6*U} zR@sC%@CB&_yP3Irq4}5(o3D$ImHv5Oc|_F*^LSiIhkiunl0)}<5#NlHqded+{3@%z z*vZ#p4ShbJA-o0eTNd|*o2s872%cfsaJB)5;jT=Q1&D3Aq}`a?bK47DjkDRggOjjH z6C@1lF?l$z$?ZJI6*V|~yM39gNfw#8%bJr|JQ0MdC)IQmO#M8D7~j;_E+QHuAgaAa2i*3O0j&!7uf+dKLC_!`uy zt6I85CBqQEnd76OPupJb8#s*ILvla_mVW4L+IPQ9(Ldau>IXbShC!!|W8^;d z`d_tH4?oxdbu=^yUeVr=#TL${j@H`PG@rK5l-Pmy&&1Y8SgU`P$bPY|;kN(Fhbvj4 z?n#4}(*zuTHD+bX%`V5A2M-r;&Q)q0H*XRsY#U-d*-ERnN;hD$`ljbf#?zu``A}Wf zX->IRf2FJ|3+1j3F^kfN1-$d+j{wgH6y2AVeVw_uN%aCRF|L#>`2CW3krawVg!B9Y z{1gRm!nYrU>2L5@5ghe0V%vTF9~xelSLIDa*y?`a34XEFf?qH7^Lq)QMZ4ByFj8%$ zjWLsBm!xrtKkjDwDteo?)wX1}90hM4`fFLp&OE2Pz@tlbe%YjPg}zMx_AsH+*Q0)R zK586Oez#R=HCdEN|BMQLlB}=oq;yhk6xRZ&)N_Du$fW%^wdMXdLBtcHe4|`qJ_D9!UF=4hMR-(O%P&Z{= z3~5xL$P}7xnlX|xQGu2AqlG&YSFHB-09Az2+)t-cQr3ES5 zCVw{x)0N*R4~wrN%nsHs=_mIm`pw(=wOKiNwAQYvl9uKd6h~KmptZF3!C0}ink!bf zBRN_ccr97~cAP033?MmG{U7JE{7;E%xz?&{0`WC#CASt(mP19%z44r>#Zw8WdNTX0 z4BT8c=nRC|$-AH%>k%#-d{lF1%DS}$4OKArXL6dGJh_9DeyCalOvDXN-yY6ou3EB- zaWI(b&roY%t~{VseHLy%138z|`Ipu+$nqcgJ@51%rvy0%nnLk+$z8z$mBsu1-kSK= z`&z|ZrTL_8thAV^MAhu=ij(i_IvG`00OHIc@do2_8!mC@x$UrX2NxclK`n=IQ-yX@ zpOzX*+t{lG5af|RxposneUp9WqutIAZ1s0;d*D+}f2ez|s=3Ms$X6mKM^R^HUet#f z%5`omA;_VOSUKVGXxFZls`b-K_2!bW2X-u6pVuBRy?Jj6$LI1mJqiliLorEQE+3$y zzKC=;P(?N!ekBkk=BtAp(#_7+w6T}PTe8ejzVjuO(sY21O8Nep2dm*Pjm}ukOkBU+-W)VeRN=+*3#!G9do-lQj5W7xA|u zxw04{I}#*`z~3oE*rXGo&5K-_*cj_p$_Ki1)>2f3>4YlbDp{Qjxa{-;1pHSKJcI`f zsLZAhzN%;TtXAIs_CfpqAJFEZH$Hm{P~tVsi*OFaZ1!6aD)ZzO2Lv!^|TOG5tXMas zRvvPZ!-u=0iLq+z7JIy-iYf~8K}g@sR#Yv>??v36aWMC@QF(h3KmOkdq8D7A{bNPm z-vb+X8(uuH=!Znx>7JZDsoGD;`9=lC14*R!q(^hOc6F)Ye)a<>GYjLAD1QWVn?mTy z`>~2u|GE@tn8ukhJch}yvE19fL2#=|O@XDRY!z=w;MSDbf=g^U8a(KmIzJ0n;NdoE ziP(+BI|Bn=Zj#t|JU3*pJyzO3=Z_q*BopekJyGrfos3ob#tGxzamZ-v@}NfN)83dr zk&hj1?#hvBzZj#E{`Kr83tGh)=3ggkbqOm^!I*ZQz7jc5RzlgTpSq-7)aMSugk6x|k$&Lk zsxrW&;ZL!gwfST2d{4I5NP+Z*BxSm~=NgX4U7o&h6F0ds**94(!iD8%0fjSt!?Yd- zzSZcf{2wPZ2itAAX>T-LKaZxx82^hfJ^K+zSxUmBfqsfo9HB@YkW%V-f2XuzgycB5|g;hSXZSl}(2%#A2(}mJ6=L z3ls*@eQXe6Y4n7`!*(s_n+(r$cB@0gF2bi#QvkB4xc{w%i$C3z*>~}$xtY}$lN*n` zd#S!vbvRLV-EUw>tSp8}t^`>k3sZ!48IR-oC`9ek>E+=R9hRqw8c!Lff^0KLecd3gI?u3&vPK+(O5*N8U@8ew6>RhbKpG;2rGbP{->3O)$ z-=CV0VwrLsy-Us>U))dPKty9;-_+QOb_6Rf#uB6%3rdR_6rpxDJJ>ELE;ed{Mn5*5 z?o=kUDV++=kIS5J-XxZccJ>Hw2`Pg!I1bw%gO&35h9=G^s$9_ zc+F3mw{Ju95fOFGzj&%f;bK$r7e8|;@EXJh;H65X{I#)S9!6eTYKH+YKjsBTRyrge zXfSk;19B{8yK1!ECD>$va;e#3(I%(L+yN6D&qT(xY(W?BmjC8D5cX|tUkD7J;*hh?W)ywRSW^3!0eW#-r{906>>KJ zN?#n~2Q)ZD{zWK)xZur))7Q#b=!o>T{h*zV-k z3;fnKImwRJ3@Wwt_#axk((F2fL1E$D$yB7VITktNGp$8}{GLu^dZWeTZyy<*v$02X z;a;sRR?z&UIsk}r%f-C!UnAQvOtr1N^W{$JJ{ai*_KM9`rl;Zn%8$q>1kK@|*mr+> zwEH0z#Mrl-AO*SQP))`CP^)Xk6W8+Te)9bk+i~17oaqy2`n3Vhz#6T62x}Us4>@GT z@)IasO)RK%%0D3I8ELR8mjf%aTbB768$-k!Pk28szBx8TCc5z7HFu{W*WzKlG89cj z8nPTbGgoR|KY4O3`RLE_yHeS`bGX3SSa~G)i2p|LgoK8cccUgTJnyt{JpNbkG_JqP z6!-eMu}YA~N`1Zv#V6GFEyOM}EGa&!;--RI7(T=stGuZ)v-{C}k78Tpy_=M;1k!^B zv!nLEHnXu6tD)jiq;{q5Sf>-^vk3&`m9JdT&Q$+w3N3K|6UpbSr{yoPx8pLVVsxOt zv%YJvBe5|h52B3&Y_~1xjRaD|q~f5>T)9JB5kwx$NxASFj`HThFHjLbU@4!xm+U4Q zkGJH*h&0?OUNeB$!SZC%;E#-{`BIb{57lxi#?}qMl<^}E0OV_ub+bQ(JhaSl+RggN z1?OLWG=7b~G<)Xn&NSM=F2*BwE)ZO7nh*%`a0PP2S|Y} zQ{i=6WVTOm5TN$;w*0k{hNd~gam>}8-beL>ooAyb6gwA+L-~dIpRa|A1gjxtr$D6F zeOI6Mf46KyNaOpG`pf*vF_Nl?HRCmMU5g!ul zqxfP7=%wuhO{)VQ%IY15i!C|A)gY7IR)Fa~-fkas&UP<Hc|5n zweZk^-6hvVRjVUPmbZG@GAvLNgm5me`yu`-1nwgFV_RowfVB&&#yhkllbAD5 z94?3lV|F@zfI9p1&KGgf@*Y@tG&wyMwuy9&J@UQ+9TnNjj$wDhZgV{~-<&F|u3LC} zC_YGYEZNniAvm$&Y0UM=S*lJ4oykg&Oyk!+z{JW)@aSlkXm&VCWy!-Lfwl6}SIWSV zfll^as8VzZ2W;fF{Yrt#INnFzt`mzSl2B3zsZ*q2s9mM7DEKWDj3g^4gB%T|XX}!i z;XBxBErTBu^d*<^A#KBG17IIUayl@Re)*a?jX=W$osX@KNQ;?Fiw$j~8a0vGjeeVg z10w%KBOQt|g*GmgqE$&}>mv=a4AgO;JMtZ>pU=W#C-{B*RF%3mgf*q>08NiKS6!H8 zPmpxbL39gKFUo8lg|e~|)dinYwCYfLqw}T!(56kD(3zQl+EBna>(bub(!&ka4;Qn! z^8qOpJhi3y*fL39QV4fCYMg;syBIMeA_7I_q$Bs{!A17{Ncopwe>a-|l1W$KX}!E~P%HTPo>Gh#+N5DoVmuXzjGp;SvI>3L;F{iIyl-t1z)e zYORomqQ8>^>5!#ii2?M!M3R-I5XIvXMa7H6R>`2)tXI+#Tmm$J{9tT{4GQ|;d~afj z9*pYuCgnl?U`*rca5Xre3jLQ z7M<(csI7A=;7&x@C*&qIdQmn3A->FHVag|ek~n*3FUbBz=Bw?^9p4ue7~Rccm?Kb` zD{??oC%jQu1^>X9+0mfYh(_W{#5XiqkV5C#VA5Sza_ji9N)Xdo==1zKp_5k}weu!Y zi5!vZ#A*E2S`n)|j;g!9x)!t+G?>@no{cjaRhkaUVKAEHChi?hzfnkD?ldWb{TX%5 z*H1P#R)lw6K8tpt(x2+~qwsKDfJSb7*n7ZqvQX_ZYaaHV8c9F zR0Rto3BC$=uQc@d!ds&=>5I4qMuubAplsJVc3o-<`4-MJE7mKD4djU_B~TI__>+#G z!`^ncYr^8zTNy*R12M&=7($jA5s`vMMC?p3H`HRK)lfQ3V_9`oSm8jIg+gXJ1c7OB zoI6U2Z?Qu~l6r4N0Hy^Qdq4SL268t1?$~53+|xlcCUQ$-+uXl}gxRFux~y@JcVZ2( zGi>zLOYgtx(phWkwhB;`+^aC_8jLM{wa8TGkE7q>fOqX|tYGgWc7N5Z#ey%utm2kx zaT$h4n;I~fHgtOiHY~CmdCURJJv72xu}+cRxp7RkfpM48`~Tt<#a+<*^L|`sjg4sK zqiS;RH1%LBYtSNa@XqMPqU4tS4QgQC3wMV$AET(BhJw|jdTmb!ibKc)k%%rFc?5Ap zr|Y{Hqv@c%4zMeM%yno@3V9YQl-1MGr%PX!6k2^yHMmo zCdVTscewS|IjOH)A?~9XoKx^8E-~-tN-qw1KP9)G7J~E@X?Lwt_O>>v4ru+)2 zIJPAOp4YODLz!TKp&Y0-jjN)B@t86y5}x)Avj-JGmx8l&;4iGXD_IF>lP6e_z( z>yMjmg!+8iZLYeeE9=!yNQd^THXoL z+z#$Uo;ox!3FXcBjXQ|erg-Or@tj0B)So9SNel<3@6FHJut8YC_Y8A0CRSQhJpw$D zr|A>dj2uGlVC_~+!s0D9w+K;r1pT*ftO$m-Tb+5?LdDs0gEWx2yZ{H{O@B}}L81EI zj?&_IsTz(F>{#*E`#KD!Q|u`1^Xlgw9o6%LUrF=Lu++XkJ&a^iKA&nq9McKhbZRDv zArBa~e-4_@)Z0Z2;)`x=CC;_Km$g_^Bpgjm#)L$Y{;ivmHQnpMcBh(Aoe#Mx2=EWL z`meyoE-oGJgq3|FZc^<<%k>UU7NndCrif`CDM4dg#ma)e_daIz6UbPW zi6*D)b1@yM=yoeDb-+q<3v&Bbq8ZNWvy3bhR1&;(&V!Lp<<5ZZKOWNgt+%_rgsDH~ zmlJ*j^@{zEha4zzQuC(_llXt9jj$1Wpr9r!vK+X3UG5lZ5E zINR^3i_cYv1NOnL^x>zx=ewiNVwLQ~wfoFL&A`c@69?X@@|t+4Ln*cmD;EoT2K8Wv zo1fT;>Hv7N(r}9ZaL^oZ&J@wFz5BS60`MwW3=u*wW_+`RXFAUJi6(}7tXea=xJh&cVig5&EXbtb_qkR z*^Ig-<|>%J*m&-vKkbx($&_^8h%Zw6t9a(o!!M!NqSsPyJKbZpP>C8V6>9slB3|ZI z_k4|I;b`DYl(qH9K)0Jzva}{DrcYKt_99_dZK&s5+xnzqynSa)-)%9~CAF5ew6f0> ztQx*bMNmUM^K!5ZvVF;PdVA#p*VKOEhn1|WI_hG5>`I57BU92F-gXcF>>bBSHT|jM z7M5)uUu#z$M9S}=seCqk93J8JB~BRn_lkqsc2G5#s$ij#a7RBVSge>%uSQ{nL=pFY~KF8T6i`AgV^wv?bV7kfM zFYyt)g9eFkDESUe#GCgPMDMsYbE%Ux78_RLY?Wm1t@-cc-yZqLVtEG*q_KU)(pN*G9zD-$?r+p+o@hX& zn4_#)qc#4Iy5yl5b?XMKeJv} z{X`eut;xLbx;igWSL%nXr=DVhSG=St8nszzEh=qu7uv{V?Vau+@1~Q2d%!~Sk68G>( zVZ z++q_k)aRb^lGlu26R8^3{=Q?KGHo79%(MF?W@#+`OX@JeS4M=Q1~q9DE*CSh{}t;+}k^ z=Pg&eTp3u)v03SsOFq7#` z*CoK?uVAXRlpnXKeKD=j{7( z%Gr2r*BI?xnViC0CP-=c;qTx=bY+p&VvDi&aZJ#%mC}5Q7OvUQHdbwgO7ayKxaHWVhQa3%*Mv76 z`K@BXQP<_62*_NgfcRnU&AU!i8>X>Zq?ggSaSam#`*($R+d9VD1`MWw<(;#nQZD{v z+piqNhie@5DcC(Pnv5JbTOvGKm9JnuSayC8HUh=AiY#{1)dV-|LRpa){9Z)fR`Bo> zW-F(Zo2o8^&F9jIC67jb4{K=HOp`(A#KV@0kzgx}PSH&i<^J9RI3Jk@zTN4`*IK$8 zBZj4+FA?VNktceJ?aJaLPU|QP1P0}+OU&Dkf&2kyrNnm6Xuo zY@0Av=2zYjksDd$+p~K=QaD8Qe#3Qr0kI9JH6j-;F#+VlsLsP_J;{Oh3Le~O;6qMv2(2X@=Dq-iApSe4ZI#4h4Py)$yI3$SF z>KgkT@M}N)5^_Jc<@LR(-9T|?Yy&Eqvr$BMU5KyOngh-BH#maICcfB6 z{R7_GkS*^Hn%7w{9!wwZaV9ghJP{uzy<;-~Qd43Re1mMTM`ckkiTc;@KaSM4g2R{r z6&xQIV6tH%YL>G|npaK!vaD%t87!)?AfH(}^x*&8bUjDH`}M{94uO}cnGQZk)(700 zkTH?~?+3%JnokCHP+kMwbU~O^`)U75`m4$q_%f+X_Dd1eH;_)VSQopS?o_mwFJ;ldXsDe_57>B9r znAa_tszm|p(_O##^h=w406p#NTH56MxeM6ym@#I^V8__ezf3w<BoBo46 zn6L-noq*FHPv#?IFZX^74hICvksU9O0uXNWs=G;XyZFmMaHGhjdv74f_nwPHej2{t zWy?i@_nHD!B$A3sWh6zZ-z5Uh6DcbJBAy9ngs))N2dc2%=!^*bJFM0HzW0|H5{b}R z91&UFwo$gqkQK{gO3a_MbuMUtc=a6DgtV_4v zD`pnWIPAPJhnPXWFdyWOlT_UlvqH*F`yn~$-v3QA+TOs{;tCqQc|My%Jv=A01$S^V zcjhtS`5BFq8?FN@+xL-+hkHhb$P?;`A@a!)Z#X2>M!_F9EJhX$O2ZxDohk79GbBv1 z@xs7`EnyNa#1}xGO|-}m?vX~P2MWEa*tS^u20~kKXg%p$dbWh2G#qj!B4qZdpeHvt z?k_c}=dT3zwl(93H*HNPciD{!w!*p9`5W{rBgQr>ch8RItmL*)bgKkZO~2EaSsaP= zZ`Rh3HhDuQS>OVK-4~UNi?=zl#5)AVM5|@n@9-T?o_HGqM>FQyNTYAfD`1&UdbV>D zow2nbj|1tV9s5hA2ol<~-sDJMUvki^#XG7ZI48j;Pa zTDx}V66VKfYhzL{U>XM5OJLNWs?C zTQ0JK!ulmaBqCVStLSTOp<(&2qq>lyw@Z6jsayAOV>yY|07Z0yW__5seqGUDrH@P& z+PFBC0dTstH&suHTjej?KQ3=sTv`Otzkf@;+uE`;{)`LbhHu#_uT&~>Mj2AY3{;FH zJYw>pF;F(6uI9cuYSl@GqYdmkk**ykHp0V1Bsin)gZmyJ7Yz3_B7;4kd0B~mRSAxI zbRsoorufM$TLxzDCAQ_A`4RcJV$Ve<*f<`d99Bz2Qc0-aoTY)Almd8S*@?KzoFIQnOHJ zJbRlm>H9FP0n|DjufO5g#tW#YyUKW74mZ4_$QO9Lb;ox?t4_xwARla#1vih;G(99W zjZQ*^rqR?rG@V9L`=IIx#|d4>2!z|_vkOq!Ia(ZGBh{B&_{PCD&Yk2QL!f?BnY%+v z{r{Ux3cXk^!UUKdhuZop)aKnzRU2xky+Cc}=yL2G@lkj7Y6OB_HAo~18ljrkfa5NF zgvlJmcP!Zwv!Lvb;OnB~mc5Od>Dj^dgpw4R`v=9DH3N8E$1S7EW4LHMjoF{j>caPR z^5jFempdpKDO)DP_ST)8uYWcGyF$CEV1UF=l@BGUZO?tlXXNs^4zW;Tk8@t(#Mx5C zW4b)Mx-28F`nvs+%^hMAHC%-vFvwHq+x5=;pVT$q{rz6XI@m+{>7A*!fqS7%o1e}Q z%~_11nE}0~&>CVrQxGY3MhCW^THo~Q>}J(?q9e$ew4GD(wSnRp3vB^l!@GD#lYgu2Y9w=ebsCzxj&8|HWP|#l5^@UMLT-Pi#h1{A)>PN!Jc>;HfEU7sZ4f8N zy883N)D9H>!mXa3RhB)qm9}Lov8}^c18P-gNV{meNd3PYUw271FKhm3+X(3(?I7u( z3iR9^glaRBvwYKr4HFJCQ&bo!skJPtgAN5C`i8|5gH4PnfgxF($X)7HVFIxsN|I}%9GFK#ZecAlFdB>%))^cZCEs%6P>K!Fk#d>03$xm_QauxB>ym2qTQ5B|P)>Kuy5luetABj(E#~vAEzJzv+9!`W^a7;4Kz@ z((z?!)%+l>Fj^JOn}DA8L+=`FnOHXnSm()Q6RLG5esHJ{KS(N!^hDJA$Dc-?j;F?- zM4pU;dd{;Q{)LW_UUPjBs9j^-(qFixs-vJvX#d2sIQW3s8Soa7#EC6O-J4` znpwZTad%biW}@jhDT<1-;$A;o=?f0kau_ziUgiWfq6D!JB^1$lM3_X10s>HR&lZ~G zx`7Ok<1`3_*8cmb z-dM9{S52`)_i~i4CvOZ=)HQ=|spGWP{|sd7I>HXS_5*jTc4e&2c#OIjlDj8pRn^;T z>+)+Od7B&YCn0p(>-LQxFJi4O=1LD~_iT`Zbr$qwC7ZN0uwe2JitJ2{Ti!656~Dc4 zS2m-cBoTU>!zIuC=R_#kU2o-Cfys-h9H$w!noMxQwIwYL81F8V>yiNaqHN70>0@Sn z57tLsPbRG&L2gOfT2r$Xhu8v&H?86lV7@6^`!h)}Weq@((lAqXrQGFkyD;yg>aMf+ zR@0%S{ujX6AlMGSfiPiDtpr@zT%3{gY9+n0dVL*!TEu(SrDHej+V&}C^Zy`+dNw@O z5su?wDPoTd>IOmFpVR;)ob9K(0CPDzp$NrF#bu_-1tmg zc=-%Pd^c=aQ7*8>dj%T0!_?N?-;e9zEy?*%odV7= zIWw=BW#Q>NvC2MQLH9Rg0)d18?-S~m!2o_x#H)eS|9s-)#=#;5|2~AnTy53A?2;X4 ztADyKF?FBq6v%BL#R`WLXq0>Yg|I(WQ~j)6iusSc5h+t~<$l1~tJJBt{6o$5g1TeP zqD_PT^|v%Myf|`w*nfYvv{@a!XQsisu}o!U#4=wD?j4}fNDqL)UZu|)uTnt%bTj#Y zH@MEl0>-y5bs{aTW9yj~dT)6juwGA4U_NZ!{W8llPB` zFgQV$m?eB(G!&W%q3m!JY+o2M4|G?Q%hCkMAmfNld8oa>&4aa`Nh)F=mWU(5;k7yh zQJ4iB%HQ@neqCR+!^7avbySX0BL~?noMOlRlHpp(^wG4>4+nMOTYu~j!@gIRhlQ@Z@H1cWo?2CZC*>EsHdPAbQ=)T6_S z-@>%kvD}!}NmVKn0%;tD<;hVowz=`}Si0L1lt_yWnjo8P25%ZHE*!U?k7whbi93{I zmVgb@S20vx1%u)F>aCxJ!V((?XgXb*CNi=p6!RB92YVO_#5=*z`eBQN%dyB|m08Z= znk5KJqUKX+YNkY@W74QPKA?mv40?3T6mp|hE{#>VFj`joMJQ$&%ZX_nRHd??kJegc z$q|WROXHz&dKr?WC~c7CNP-3H?2_wJC5)tKa4!?^WA5pt<(wJ}q^adraM7F3KRE^E z1;Um!ItD6sy3;kGS{0W4zr-Loz~OYeTn<3pAhIExivlV)8)b7lge#Wmx`ZDAXL3}-EJ$$gAY}@EfD0} zWgNqn3Wcsdj;u{v#SPk8L<)_N#ZdEj#ntTrhkD-~L1S$e^Y(C0`E6^&34uz`3!J#? zkm>*`WO_x~;of8M)(yk8nOQ_Wb5Ic9FhX%%kH^Q!o`ykjpV4PASONgDzbWW#H%Hqb z8n|PB<)Z_Gu+Q%uKNZ|*Y1gx|5Zt!Q1vV{aw$#yZld9C#ztDq`!a(g`)uV!gnr}_CWQR>^`o$OSHbO2!7j#N-0d}TMW zJ#3-S(Z`gwsjIsJccda(W7K>m<*k^e&1Pg>fld z`fdntUrm7ME;E?lpV*%qflG>VG(td<>z5$CO)Avur7FMfi@1#z?xmW)vkNTjZmh%< zgK4n>>KDs0*tYH4F0?PHwYq0-8~@?(#(&crKP-cK&NB$*5T8&sfwnoUNIR0CwLaX4 z8!vW~>?Xa$A{I%48He~GGthmXo9R?*yP<~NJssZ;{K<~*y{JRcbXK$8W9Y%R2XOe` zdz-ZN4q+p)p{)wMGv~dXzWAT=HL_9VeR_AM3lw+eSlaGy!}WYy8q9o5=Rw!ljC#Mc z0pF&^6E`*YR(bPU-k35#(F=YQv6-;Sd-<+M4}@Q$EBywI%QWhh;}Zrc#Cq9iV>w#c zflsxyPUAaf!JaueL=!w~O1yfX5p6PQBHd%)@-!tMk+k3NexJ6PVU}sMW*MV7JMzPB zcZna-pm?aY6~cGC%Cz6#T-M}V+Kl?WD)|q9_wW)0IKpb)cdy0!b?fMmAJaI^rNGRW zjW^DrQ+Ry3t!<`qoB_9|o!R4&2pgSFw;+h(Q0rF*Gh8_Cur9IEM8N5HVkzZD;58SM z#DHfmDMTROX@&=k%xP+@Q(0#=)buFu#akgO2wG&NSfD%EDOPZkmh&s#(i9g6nquAN zUvl2_+p42dwu2!8Yz`a*x5U zsVPC2dIc5YMG~9rrF}KM+wva-#@u1{(D^u#-lfxHE|K`5ZbXRZQK?*fN0z}D1Ait= z>8Eaas;nN3#_H9u?80NFn3m?&V?6%R)2=&U+m!X;MJ4K{Gos{Ej+`fiT_PX0hq5g8nt ze58=MQJH^WZ@T_cSO^bDdkp){|7B~=KB`K3)N&HTY3+`7U2nZ+32j~IV|nuH(Oq@V zv@fdlGGq~%Y;{?8r(o_rwpX4%+E&t*L;gBsYo2~wFU!8MEfDelA(;999%#ughS=Gv z;#ODkaj>iUHgtx@ws1rej1L(zlIF`c6^oLRZG18f<8WCP`h=dF)9CUt!XCUhC*oDJ zPcvmqyVb6cDGt>CRoeo-m?J-T6U}ExAF&>FFC}325Kmh|z}#GUum^sPw8AT8fY2Nx z*wg(|*h}>AmvArTG8h*A>yfVmv$@et%JoG=pUmgY?9*&5N)97o;K!AA)RrC;j?g`d z7n8rqDy4k>@I*IgoRglpxH0~k^z6lh@nA5XB2A0O%u=sOjiXOan;_qvX2%|o{7uI9 zZS8@HjJB>>WLKliJ3_VAl{(s7%H}s_eP4}if3O>U+W0PR-zd6UuXrj_6QJ&We*{<* z8W2&8w^XAY%8m{zw1Pjt@1XRSD+BjLGG8`!-vn`K#`T> z`UwR>;XlQGOicLPO(2MT?$+r@XV2uL_UuVb>D0RQ1Q2yZ`}l);)g#(nDN6yF~DZA;RYcadBXC;Xwgj)qhgQ1Mtu`XysDc}!v)yNk+9+;`SJBg0yt5ctO2R78L?43kt1t@L(ZK@$t zMVnx_2*!oB%ei$*fK&IgG&DKIH^ReI*a@*HDwxav+NQU5qPP}H|7mbK`+yHa&lf^w z^&RKh`r5$lk8oTp?@oHr9$MXWfaFcr2}DY>IuFufXlj~o01*Jh(Okt)L8W3bYPfTw ziP5=UO24FtaL6w7%Vc+h6$QZ|z1wS~7eGp1jogRp`HkQY@C-la>2aHVz}HUw#Q>5< zPghh)l+Ba{fi_#Ko)zVa8r0ez4Nwm6nIq?t>vJDVG4|?|gQuZV(xO7Gj@7zB6?Cbbl`I+ApRD>c< zkJi$2>xGh06cocn$s-+@QcjT-)zpQdSxv7yl+GXg<2!Ntn9q@VZiAu=&3Lt1h^&~| zQF^jv#ngqNS!#B0&)qYZ67&goDycit<63@IcbeC-vTj}fkAi4ZZ3S5veYcb=dQWYY z71h**Q?uGWZ!`bsSc`XVAM-iBB&*b3YP2-cH4_X2O4M3PwbW2AqCc{Y#qFvlv`1VI zS9VxWO~{I=3#aB#tykUn*h|E>sMJ0|?U>;eQOu+|?y%<_8j%&%)T~#XHeS!6f>>57 zdUcg91VT)KRYXZPStzPOYyG^<{0j%Nf9q49`_k9G9luw8%+Em&9E*}{vQSim_Rh7p2B3hW?Cnn_WO2Kk-WJa5&H zj&1Yz!E1i7d^vwTGq+zB{_-ZT2scHJkQCLBG5lSVi~01H=Cuc1%_@VpX|bhNT5UsX zbN(h|dPLj?ZkSOG1T6df7apndz@Kx-wej}N+WCxa+OOWes{B>^8i!HGXsO0^WAqj*NQO5R}tG6_+W1V9D3A*oSZ8Dq?wJ(_+ zliOTQ?0uQP=JYsvU{jP#ifYYZA!`eNR3(VAwoUNe6*KILWJ;*p9aD?v|NKXkWRpSr z?CDwY-XYTilWOeU*zA4L&$ep?bR-5xXhm~eU9XDoIZYU3b`FfEK%@)1!{zPYvpeO} zXXqO!lvLmOdX&`6^ZA=H&dSy)S{6+nPWl**4a@0@y+6bnbcCJp3O-Dp_9Qq-6MGEv z^@p8KwFDu)H$Nix0q!^?P9N*_$02%q< zy5cZM&u2iv4vNxGM5~&-wG|A~qlT2W8aLVkW#Sq)CivYOuNdTxCh&k8f2$bi;}hU$ zm~o1_sU7piEB?i5C%ny-0|5YSK_=WBrrV>7w(wy2Zbt%jbqnKD;&ue7bGh9Vcq#4( z3tZJ)?Uc8_a&;=918C?StelaG=nzifu`pw(ZflQwCn{&StJ;%vS~U}E&(K-4uRTYX zm5dTyK@pl)+!$S*f&d8b+sZO<^qoKmyYFFQXo+#aZwCd-4~@PPl_th8c}Qr92^Ibj z=A8c=ZW%nH?~$060C!*pErFAl`;UKy8AmYP@xR1Xpl&Jwszhafd)I*h(RhJ>=cR|c zzwTcP+;c4GI%F;?$~pYTXuvGTf?;^+Q;EC7$qS##J)y;F5XDti+)X7NoYlmNsh>!Q zj|9m{Ca?GVMLp(Z9;@g>-NB3AA>xR1NKT`Mu9Ny!tmV3^)N2889+UN|pQqT+aF#g2hU z%F3wb?3BBjbLlI1p@NgzeNwQGmhVqeAu8BGNKL-hJqaqd>v29Kd1O=zc7o0pT#Dk{ zcc*V%%}C|qpjXDF3C3l~Q5c6#rgH)D%o3ZZA}Kv!>5<$B}XX3z!SMFlgk z(3@iALc@1wb7pFj--ux}IDM3JDdvMi3%cNrMxxOvnr80$2{+tOh)B?@ZDNw>P9AiJ zw$w}R#?#>~30&FQGwCI`%=ObVbt%hT{extdCM8d#jG=OfLG`eenFq*AHIW^^#hlyN z1m%|iNxGb|e^o|fD7nH)VqDBh%tVtiszz|jY*hCgMO4$ah9i^lm*tGVnrQgLPI20O zhp3yn0JS|0Ivc^ncHYw>bPhrDN}uY#{uG}XE`u+r9BMS+z$uKU5Yy>b(t2&4nbz)! zv)r3Z#YM&-WNE=dmv;Qc&vGPZ{Ew}k%bMrq?W7GZ}0M+b9;NSOFT7rL{$zmvb96o7<$N_xr*I z_UEtZ%Tiq*^SCl4rnlOWTj#LF4UQs-g}L>HR%&xsHVb|CBuBO?#A^)GM&v{C- zf~uh2%!l7tU=QyLIR2g0Js0Tf|7fOrwboz1`}?7hf6-{q4bK1Yk3sy?&vE=-!sPrX z{@U=AC+X!y9q_cU?T`R+k`Jqt%a>~ zJvo0f^#pjrwWu}XHv@~oaX8J@_IG3^I_jayCS*9pm8pfJ-(yWIEq$F+N?xDAKBUb? zfm+l%h1A$1pwbq?0@`-3Yd8ANK>6zHyf;U-33bJ(vhd6 zGI?8z&>bG}Cssjqa10cgRXXgVu_slEsR5!O4(b&M@%VS8O$4kcGYtT*c^zdh?r(+& zP|;3&16yu@cgEUB#)KeeC>M%J>OwKAh3eoKD4x&a3B+mEV8PlB5x^G#HO2Xi4+Mr2LW6K;0h$Ke$k8WL1pAs0%Ia*a|t8hZ<-@@|$M8-3Y~ z>?HIU9w7J2U~)Qc`yGoA`g~I%v;eCh$9Nj-F1kV)Bt4%d643t|ym9$SnQdW#%XoQ3~j+-f2k3U7BQ=TeJu~5;TWz{L-Ky528mHGh>+#5uBR?>yAdJE&5z!d zn%p`Tka&YTVK_7ocOZwfSg{J4hdYpa(}i*d{MlxJ!SFXs=@oSHwpMLgfY0!TQNd6M zZ>$~t$pI}&884Muv^zAyva7rg-IQAW;h6F2;N@1GdJ^8niy_h)3TqlGNORrPiNCfy zL?*Q-jEg+c@EmP^g=yKaj5;7>kKL1xE#s>U;f@oH4v&!ZW2zB1R^+%)|1X!J&EctY zDC$2BZPyw*s+*I;OV4@LvuFGXy!jlpO8Hqy#4FY5+UZ8f{ks zvF0!jpaL_%Noyr$IIs2V06&^%BpA|eZB-f$UDUx0aFCCBLsr!M3}&%L?;7~)#&qSL zhAu}z{Hgp|qRdC?p<8M+iLY`I^4PO=kHsYe5?Uq$a>g>ynGwB>HwnE@V+p-2uQ+r) zr6(NQ>;f*j|E)7xL|p8mQQLmjnV@!ViLI$iL#a>n$v|flB9@f&imup*0z6F1?yE1j z2@F7=j3?W-7as{6_7Y|wA&9>=LLymroh#dxPqfa_kMp;Qm_GGk|GXv5b5ct zFzXCrZ{y;bDS^K`rsaMHul7Nb&^F4gSxeqPV=Z%swl;reL1J#3j9*`UtjQYy(Sa&lO#Cv8ETD@%Xe{7k2K_`47I;vC&V? zdj^GGbAYPckyYDV$2PtvgJ|R^Rh|*G?%c%he`7-Atn_X#Ic8g!dCV{aP#aIwhh?ZA-hX2Isspf^W~NFsK!5LKWS$^_WV&aJiwzf6B??cTYm8$?AG-_ zPO|430(vG_7krA)8pX^0HNA>#6Mp~rg16Q$C_VaN-I3a0UU<~i$sC_toRCuF=4VVI zzfykfN%0xzpItZVOP|jFYuprK&USFw3p&Xpy!{2!BKDkrXYxDr!c+U(zMxUSHR1F+ z=l1_UfV0T(EuL0=_t<^o=v7VMq^`e}eIwY4+a0-;1Qzf7K>UbL;;Q1B46!pFI{Oyi3G5CRe zj&C=;xQaax_3o!oMQWRdk2oviqH)Nf<%WLr~>tkDXb@EM}kAX><9uKmX8d2(hO ziH{{`{n+4}Ur*D0ay#OO&XgCAmCGeZp4Sf*2Y7Vd{Lb^ej`-)SPxo;Zq3WR$3f_9u zNtI+jUQfE`$wxj#j8gLzQg5~PIX>WfdhH^GhP05OSxT0cfS%lg^r_C{d-w4@0grVi zeE$HzG}F)BM{7%*wU@0Ai2TN-=!phDFnlL_fG1C)NI)x`j2=zFKN&HpeKc+I8e&!& zaKcg$v7)OM5JPmXZgwT7omXQkgG60%oc`E<(@p|Be@cwXC&zXWAWH1%IBA+8o;N22 ze=ENW0+0Z&eR<_N5=;DzV+`8|@X061W-mXp$G4vQ(qd^|Fa-n<03d)rE>yeP>_JR? zG~~nM$|Xxu&mT9`(dn(gY?t3ZquE852#ozT>STFlUo^}llFtRXwpHgas37}G|k z{~*0(Vq@SVx@^UsH5MxPxI~BRsGw7LQ99k@Sh4~>l0leJq>0+`j4XqXZ#{V!N(5s7 zbHK$j6M=cmPE7hZI@y$)Mbgw0T1;?8TaIgbUTXGzA>CTAC}a~YuvXY=2_~2FyS`XY zX9gKXEe6O_BUf#GUlTUUVt2VOBSK2vsOtte*R#4DKuwcID3|+zl_L;a&p_5yE2tFJ zl=^OkI=G<6>Y6VXztdmM4x%Av)>_E}zI6m*6om#u0dT7_9KidqQ zv}Wjg(V|NAD830u2cMa)^{D#DT3)5Iz05C+9<_aHV1wCqHOwkqrJe@OQ&wz7&57=p zU-H#_O!=YaF)c}#Vjga`9G3(XfcRrOiIpc5k7f{2`xI_UV>Yk!(1^_zg7v&occ)Ll zSxC0^%PuPbf7Q4>9GC!U@A7Ubc8jl+F9HC~Dm3Q09y8KTZGY*S8{P4MMqT4cONPlu z|KHE@7ataY8XW2hFa_tM*MW&OzjZh`cfU_qO|KUsyi0UoF1V{*qvkg2eB)cZtp?s! z8=_fSFCCE9`U=#5JmoWPh_8|*x?upJHvd;QkiUYlLv_yioAm^Y8J*~|lC^=K0l>d| zeO4C==wWTS?ZbHkv$e>Rlr`Uu2T$m6R|uF%i|dtH0q z#5(^G)V&XdBbcQj0v{Z$wN(ZoX=GeTHi``{dHPtVuAQ3#0bXRkPXE!#kBu?#7Hr@h zn1G~ITq3y%QXF@i6p5=sbsO1XMN~f93mYtGqD9FS!-7o3^$OXdCI4#UK>6%?3EwVnOzO~TrocXwR4(8X)ZK%KY63CSxu8?QpQYai&a#seqDOG0xi-Ow!3i)pMOi{ zf7SfuH{Go>o3&vCyyPJtrEK!+-bSDqIUmm|@5?i!*dsy@QRvXs$yVc-nm;wql?E>< zTFf#>i&`Z&GJ;)$=e4OctX*0gD7!QLzVFq|RqnE|R}@{*WUuHegXKOE0s{KyLU%eC zLO{z$ldZmk2G9U0kI`E}aH`xGx_-YdjG8tqbQxdqNz|N`z zo9%Z}w69T-$rZUtY-+7`Y^t#sUsZQP+)(5nw8x|BUIyVc6;;KLoS$M-w3Zle&swS6#a5b{nd)Fwtuxvb|Cp+%@0r93$#(?*mhV4vI;`Sh>!0 zWZ2ZzL=~Tz^5$u4MPPti|5I&j1{5HN{IB|P-J}m=3EUIN=MV{*t;vL zd;WjXhQD0ZN@PdmR)szIJP8h%=^`3Vb-lnT;Decvc;%V?j%<#MSvC&e9jPp=E=(q; z9%fUJTF6})-BK!!l`p&HWtp}AQKuNS`j`6)xU2qyv>d?SfGdD60Tcl22QW2w`45## zxPZoK#Cz)Rl@P#4K7w#isYZG#1{)4AWdQazLy4VIL=eY~ax}`ch{tq7Bp`8BB(j{F zB8f;AqcTS-!}5-FWhK7HV5a+D3IWEy=g%gD`~&~o_&$C^Pbi{EHj_m`@~8r&sjjIF z*~!=v31m-;Z~{j0(e4mRo~rExc-b^#vUFLl_BXX;w@L?z8#Tu)zSxnxZFSgcoFDS7c{^kDBtHs` z%;67Ps`XTdT;Q_0;4~dm%|@y?#+h4h%0{J?gRR-tKH1#;M^A__%V`jRa(2vx8y!t{ zZ+2!lKf^e0n_+P|xGE8t*;G?G1=5&or@N`!@b0VbcdQ0y076rR)gyMjMumz7)4O1u lQ5$S>zJ}3T>S1i}^T{{Ted#rw3zyf2zNoseAw0GK003f8m&E`8 literal 0 HcmV?d00001 diff --git a/packages/origin/public/fonts/SuisseIntl-Medium.woff2 b/packages/origin/public/fonts/SuisseIntl-Medium.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..6089a9f6e07c105c87ad0a6ee87f412904608108 GIT binary patch literal 65944 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�(k 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 literal 0 HcmV?d00001 diff --git a/packages/origin/public/fonts/SuisseIntl-Regular.woff2 b/packages/origin/public/fonts/SuisseIntl-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..afdcff9790385942a0535854e62ce0cbd4ed15fd GIT binary patch literal 61844 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

0p|INYHq&6N8M=(cFD!Q~;2|P< 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%0DL=%ABs{CQl^jtw%~-J zXQ|hc4X^ssL(w~+F=xhRgU4SC7fh1G7=Kl5|%B;(^6ZhC}AcW;($>?PBGb#z{8agM{RJ}5gTZo zRqKkTZLT5%>&=Er5GTQq1S`sn47ik;8qrdSld{@~G8H7jDq;pR>dk>lkc1lJL~kiV zbd_-rQEc%rF<6(~I>~+0sBGx)bykyeO;y#|$_uofw}*8M320NUDObV})72;geTA8{ z+seUrS2jM7nU2r<9Qo}d0qK>`2erAq_h{A|#iQ#Jc?Y!Kke5E!XZ6!QyM4N?fo#0i z$Gx_X*La=p2Z3Bw!DN<%DzIdUvQ$(-W|oaA;LH-zTynTPzCc_uq>|FBp@b}?77`0f zxtd5K3pGI?mxn5t%u-PWmRTjr0y4`<6_ur>x#WOc9>3tqqERdnOG`@HP(>C}if$7 z68eyJ6#y_*bd`$9Q0eLsC|DI%W{pQ1pbca=464x#n3^~8keP{%iOpE~ zBg4JWqQfCL1cTrZ9MVCw(h|{nzVCr93P1r)(Eti>=dMQ{+k3K{3>AkCaLh|X* z>cb&81Pfi>8v+0hA>0^qj5U{No|eRoE?tx^fT9AZ&ml z6rYe*Az>Xt0zw*vG-}eUO;Ctm2u4V|kd!7NKA{@BCX+RyQh0=;rI4I#5)gtF5*8HV zH=vuePDCUWG%XT%B3iWQ71L4_o(BD-3lkR}K?{x+3<&}eJrYIvF(_V4QIh!@B-^pj ztzGxw+ggUGwz{hB?#MRO`Ukcp8dE`{@?E_uGKEYEnYg$)IQ5g#(W+I%6S+ZB$=1qc zXj|0P*HyN(K~%;`lqqS9(tWvF=0P~`hM_~#cEzq^HN$iqIvnu z3#Yz4hfKNhtdUQcs7<1vB1%;Zi900Mbc&TI<<8!5?TTM%X+wp#Uc0r{!s;*|hT#Qpbb4Dr7b`5cwLxpG#nv|a zttlb13b0p6v*>o3nkNgBHnLMD5vbrtRn! zH(%T7ZHxTc4)DX1`fVS>cC=B1wl{~d6?0Zm+GE7`cH&!mVU8fhw)0%li?*X6+HM9p z64hwhY_rSqEHE2ambNzwwuG%VS7gn_cFwAfYE>e%N)Zw=5;7UxI;9l}>yqLCX{I+K zTCDLmYCunoFe|jb0)}%XZuN1i28xuNH2EcHr{nXD*w4U|pVK{w)8y|E!kC!M3SaRH=NSOs{H2CO2(>A|w8nabiY6^7?O)XVw)oZdU zs!gYEebO>UO~{(_)?*v=tr6{$<|<6)8T&fAkJ?;Vh4nFAA|U@R*}hqY{d>)ob#&?a zySxfF$MEAidZc^$ZRWg==qlMA3%W1sSltP|4&L{rSK8LW`~A;f@bvz_jp$Hm75?da zx|qKks$n**gAe+yEkYcS+L9glD*ds4qh95&*N{Z$iaj)8x{BYQD>mfp#~$XtPLDH8IbB>e^QXWMTo&~?BqavvMY`;=1vgG9ly3x~gL zXU&H@->oL3MA4eH;?yJe_r!3{Om_Mc&)G90<2D1k$5?R3Zb{U=U3a?h=Wq8^JhvX| zv+)tt4EGNY2K{W8clwU(!9B4%GR+L=)^zH%yv;DgBD*vTb!+hG-klRhEJJ(H+Z^54 zkC{C!jZuhDfVXP<=I#-7 zV3N|ab6&VuX$qBV^3-cXe)wlI1cY0>$kMBxE*usa1AFc+ij%HLg=WvZF>K0$t&k9& z$^qiC-NR#(GjiY|P=t6HZhNT3b8pf8v}ijPh-)WBjv98i2sjiFjyzqGAk!U{TD|bj zh-pi9LO}%Tz%JW8A})v-CsaWqCCYMFl}BEB@2eUA?Zygmuh79_wtFNzFmukl1iLIr zwtK2Q)@8t`S?TT@D}2V>v9yULDTJnF>_Yz#|H6IsiQXAEeZh@ zORjuebwjQawc7L;G;ZFigV-UyLI=IsZqbQp**MEzv=q18*Wig)KAZ5zdJu$#1Ptq7 zJlj1gAvG&*e1*E^raYzUwCnZJH@`42V~Br+Ht@6ddnmi3VeJe*7eq;xuS~rTeLnf_ zx3vINLd2+p1MT<2AfaRHoB&~Bq$==0qfY(4nDp01FvJOwWEGR#K(X19lF0SZknlSQ zc^2^QKTx}Wss|{=J6^a=hg+r_IqCFmmdtPYuO!MF!5s42{bSo7%MY&Q`2MS^fhAATnctS7mLCKS*)vosL!;QceYOJ1vvg5* zq9=Y*Cw+3KaNgx4uc+wvO@Rhxi;Cqu`&oWljN%GJ%@mZQ2m94{k$i3v-_ADftd%hs z?HPW!tc?=_+5PiCm&G`637Tz~S=P=P69wfwkq@dDSS)-mYI}rC(xV^42K1qP>y4Vu zmwB9?eOCAUHS7LKgM9MXoi!X74njdJL<-45t_Xa8Zs1O}9x{J$diiZrKfS&nai7E_ zr*l%1p3HPj_w>vf<7dBvLeogf=u3liR5N5Aj36zBF|y}=EnO;?IQOc(S^IAJC74(K zQr8Ubzdl{=JNGuTJ-YV&Y)a60yRz?0?HQU4&DY<_*6u)_zCAYPFFlYHC>-{i6Y!fE zcXYUpQd;fBhqQQhlgE5=1!g3$3Qv=0;u!+1p@Tb>A~YFa z;5MXg4fUU8!yXf<@j3A@fz~j{Np)T|83Tl^G8LkU8WKQboyBZnQ$QwT0_hMH7ieM+ zgVxZ^J9n`!$(TVrOvetI*dfpw26)o8>0UAxkdI(u98GKlw1y#Wx=-*(#tMxi+Ne(x zn+mjsL5?{{luSket)m1HNfWFKpt0e1AblrDrpc)O?}}l?4c$v77fhNlZvz~_5M*d9 zo=DfgtXJOp;Ips3`C%q;zb#sE!SD8h5%}_yn7&E5a8qV2KoB67NTIX&VyU4y{oWb$ z#i;M5%qHfKC9A^yVLt?dtGpFxTlz5h3KL|pIb0rJAQXuuhEgM$v5Bdf++3klp`_A= zY1xiTA=3>QRGNP9qPRoPzzAVtW?^Mx=iubx=Hcbz7Z4N@77-Q0wNz^$D{C8Dtz!!3 zG_+t!s?|*-RTd8qw!=a)7{%YI6OK&IXyEszc`8FQ-ET` zY^hRfv{c=+T|exk{ozcziwsbT;S|lVMu`6}eRlzxn>T-(n%IX=UsSa8Oi(tAZb8tr z{hVq}Zay^TEr{BHfrByu)5e%0XY+y|?HS&6YEFz6i(#Z;e7uquACc1F$v1 zNh(Zh4AC0!&tP;+(GszU(t_YgBXO8u(r|zz4S5u4Dz1xe#U#LL^R{G8ubkM)z-j96J&d#C~6Y@Rlzu z+cbbQ%j*E-f4k5{P(cF!fd9ZUumV{X0gB0ez2k#Vjwk*zPOc7{7Ou$%{U`0Jz~My^ zd^BwVke~p-dE3V&h3KCWUTfCRq`I5Bj8AVtlLQHBS3QV>ql?z}hT9YO>A7tef>ay` ztBLhqzhcW}pp zIz29}cDm=K{ac|uwM2a-OVwYx0pcm}D`;e0V!L;Xf#kk28ZtQ?VMRY@ zho0QuUvCD5jY5F=#iv8(5&k_HKRbupfa9z*;zyQaV9Zl0z;-tn*lt@4yOmlF&K~*@ z9vQAtB}ooFe{9PIbaNog*jmy zjF(rULISYyW@S`DNi~4fZu3c@yPkUMtG@vT8Df|bMkQm2C-2~ho)T|p_cb`F5dQ z@kKx*in}*M&J{E;s2y80--b_zAqx`CN1@AznZ%<&Bce+@3N9h5Mm&lnH&+S7qj0sl z>bAtAc<8ye5-0S|7e5P$LCTo!1WSq&ENe}$q9ft8&&TSXx(D8~#|Qq>>QE-fD4NZa_WUoL(ZnBcJQNoQ)ZA=ezkWc%fubVV0)p7=yGyswY2-1vs(pP9Z7;hBo>CnFuRuRrj^CcJ(Zu^U=FzHS1HW+Vlf- zFW5qin>J?=Y6^uTX)`ziiJocmUVHB&x-k=enltaO{}|To1Q34+Lir+6oB2T~EuzBH zuu+qy%$PNA!6XEZpwU@u9$zH3dQQ(jH~zKpZ;k(GxfusXA#$z2SFH*o5D3hNbG00= ztE=$|$VOHr^sxYJ={!D3SBaRF>WFPJ7|4>xNP)YlP5PZu zKlix{f8 z$4a%z1->b zMdn@r!a^D3VtZ?5COBiCvL-(~xgf2Q*p}waG2m}g9 zHb8$vtde^K0B81EfR0Jl*5(BXc(D$b#=2!haM9oX!Xy>4GSdlf0hnI(`Q%qMh%^7qdUzR_gaL z?fWP?x5e%i^+;1)$2?vQ+gG!vyGFe1QCaV_M60eXT1TiS-Fnvf)NW5%SAG5K4tY7f z-<_lMF9?p}o4fP!-B#kG&puhS(DJn_(nt3XE1RDG*n?RDX@C6f=G-by!CxGr&<^*M zojg#X)P3c$<;X3seRn)}-BYYmwOaKas#2p)qh_rhYtW>{qn^nNU46NzpWZ zv)EI4?qws@KJ;l7`qsjPRNjbL#=^lPAWG7Rl#BvQMUyT>&j4X&W#{DL=H(X@7Il2< z)u&(EI|Bwy`DupYmp`7k!@pdXMy@5ciY4coI{5$=Ut_c#)pP+XSdah!^n_UfAOOe! zu<>Pg1$u_q-|!Cre!)cjDeFT3tn<+UdMXKn;J>RZ05t3Z0hIs0w%i6|K#v7L$}`GD zATHcp6{Fna1R1xkrB=JWd%M=J(EYo0f)3MQz{M}9$2NV-Ci=4f&D`f_hBKvcSdfaZdj5lR2|HW!Lj37Yf9A3!5EYkHIV~%vZo}sK8L&jEQf=p) zO+ZSoVUuQT96m5+{N!!y&v~y{vr#AA_iq{Xfxr+T8c(DssAy2>Og2}jqi;q-8)9S% zN8`zCE>KZ>3m#a+U|ZYC(XMj62fAWR4l|W;X0xe6TFo^a2S<5AmRoRdEDe1AMQ2`UR4({*-4gp9hvZu3SUsIJFdIJ(giAQP^K&AncFrA-lW_W+ z1%bjp^RHm5w|l2IcvtSNz!(^hS7Cq-*gx;5{;JBVZW^5_*fMu-GU?5Xgh`OJGbCPv zGxC?{XaZSbsddW2r&C71QPVaI8#!v+#0U1?QI@Y>zoYI5kbqsZET^QV)gE6gH8iKG zYhY}K#1g5g&VT9kx2Jl@PP!4>(YLYN>+0c#8b1Ggxmf`;1P#qw09kvDL(=c;R1~EW z*+t(M?08%f_=gwtW{1G!|8b*{@n(iCL)FS@9$ltGZsc>x4K^{z0J9J{@-JW?>OuWG z-(GRq2Od}fteRYtI-Mo}pMqaD?KfUyiJ!29pL4ixee~KlfzrGdrjjjfcP)6$-(@$A zk$uqYyBmHb%}n3^+N(eEF@TBm#6afOiN8#k*!cHl@5*xi&g@>FX+Zb@;0IDsgufhF zbr%ZiT~-(nuLaUGfIbQE-AVtEwd_b7(r5xy3%F8&Zfljk*Z{6#kOM5yPkm{-bm$Is>y(d?HP1kH~)(%i7P0(zxtZ6;oAM6?^rP_#3eUkkonJRcrK}|!8 z$`^)^KqDBc)VZ1UX_+5wOdW@vs}!PbWa_j;CSD|bd72;)Bl!a@w9-b^DB7v&wd)5? zx8DUK9C3`)LFvvalcq?WF2h~WbwGn!W@jf48S1?o@1MESQD_tfg^xUu7=@x(l#G-p zAC+McXRJr(2+cAqKGHD(^D~fP)$KN4X7?k$TLm-Ohw?Aj?AdtkcY=2S5h|euZn16; zp#QTCHp^){?gYqtIIrCiXy2rFjLaRIa|@E1Z>Z2mungWI*6HAqw{*HTK!=0;|TA(FGYo>68V8M$TUm7Py+0Xg~Q7jmnx!lLe$R8-8pIz6o4 zgL+idht{0-<~?aqM+-Vz?|GX%Yon)a&{w+N()5(-bGHpv;C*>MRpdjre5}y-Doj^v z*6*7At<|4eELzsoq~Y!{u_Y;!@_G%FFEY7{O}LoEQ!RN_hPfI>bde>NT<0=NEi3~| z$J5M4;k(^E-G}{Xre7`gzvWh1?R$*=bk%`%PTOJWfEDIm2!M^s0_OJEmJRI6 z0ruqrhw^}heL=DHMUjqWFs`9^hT|JaU?7goS)^uH)u74-)HJNN5p|8KZ%lPVTAJ3} zlt;~IZLP=68tSeu-7!)Ldc{U7^R-fA-8WUWUp1Mp(M+@3=RT+k$ERfX;QMXD=Fsf_ zb2NDiVIp{1HZ=xxU<#(RAUqPb?AWzt&xU=>qAxG(D+|OVo+PCW_^MemmJo0o27Qo; z#rST@57TDN*tKsj2!TMr2;r5kvicfpPhE4Z9;iTxofhCwRSZN^2@pLDGG2Yuq`fXm zb~q~6;f&U_3r4Mnm_&jAo=6~5WTiaU2UiT7)SF| zT{E}ncqUfLz&3u#xh^(4Ck?=}|MSi_xf}6cC;5T874iHrZ(@)H-^h1{WJ54O=rT~| z8phR)s484x=aeO&+srN~q|Q)CR_JJ26B+L~kvOCpH7|O6czQ1DW31mgfXkis)~_>N zbg9LSpQqoCX=V`+P(=>_$+Z9!^8h~v*z5}&dI8YyoBJ35sLU4N@b%}l~ z+>`f-dS}(xrvua8pjLeh61%$k09E^NPhH%bVB@e;1qmh@0cSp7ZY&9u;LwN-kA*Gz zl+YB9mV`TW;VMr($HgV=DT{}GAiKF|9j>y^>yI`nrnwqpC+1s5zr5sT#8caFU_>)E zJttz7EI{xVXgBuuGVb{tO8V*NmW?l4QgG$3957VIf@iC*tgfTe`Fozaw$JL6?XD3@ zb5;fID8B_G)fz_U?RNp%U1{mAsAeOnqxfRYvv?s$EsZ4jCR{a^mE9j@Ey2GC*yq7d zOVgH9b3;jl-4zuzJ{P9#hh3wo3N|;ryH=rF!Xv?tk2g`eO5AI>jDU1!Z3OZXwj9kg zL1c5uy@~6D4-+$~9~GHvhyp2mTe53ctQx%BiKr&cWcdk~Mz#`7o@f5Vs>US+cV31P zzs7}_*|mRT*kkC>w>oQNjUTLCTn9;v!XYRq1yaIKhyvhiRd;yWDJ*^ zUdS`;vcbb&_F;_q4B#EWvwpU&hg#6HclY;fc`P?#EoMEtmkF6*=U~pKk?3+$E)oZP z!lwfm!Nd&mfXvB+G)YGfEFs~?e9FhXZlx-3f(-E7+)gM;<%(Dkd6Tzz6Y>_EhjSQ0 z2>Z~~OsGLFgTpvEZtK9*jbZ|}1SAL|NoWhR0Gb~|91U9Zp0)8}FI*JaM5x`?=1T--rOHB-0!T^foFhY)w)P`O-!;c}@omW6v0>>jn z_U~A{#g(OE#J;l7iTt-9e)$k(h(boh8|`wX6cp9~_qFesm~pTW=E0a-rB?O7eKSU1 zOh9qa2~ZsyEIiWM6-CigH)wDGkjKHZWmuFt0HswuVpcH!rp~F`=*pVdDJ7RWlJ6iR z11)Xh({JJ=gCAS~Y^@|{BDDG1V9YcE6eWe7xy#0Q&D(l;nzXhESqn z!dK19+yE|B^+JOT(ko|_6W|m`K+b2(> zZv!Er66~{3l0A|En)GTS_G2TC1vy3wdGJxH+|^B?2BEBCdr4gN+o*qfBwBqU7yM~Q5`f=rB?CVTCTxM^F>PSBU71qyGSsyUS_B=0QFv>BHi zZf{1KrM);Uo6qV!xdCqB6Xt-tw<(>`kz{di=#nZ@X0`DOeosurHm-(Th&bO(VP47G zZ@5b^)&k5yuL4EW*k(oxQIxe*^wC1B^C6I9BmIIaF|2jR$bIQnWG|OUy0)>{$w6bS zw1I&ZmI+5F^K317S~pF5M?RqByJSN?RU9G3lcDSZa8oc>)g~k%b2t7@7$^-xKT>4X zB`P*06##$zaE~egtNW& zwE8X#cp}Etpj?X%eGla^a@J186ybtnwGn@sqwKL;TZqW2ScqU_nCGb9ILNFagI(K; zx4j>|d4OFYF=I7A1zig2`90i1zuVbkJVewj^-(juo}>y&C4>$0xq4Iy|?uw=F ztUbw713u!Kt?hCZq(ga5Zx-bVzKM_BYn9((L_CkzcE-55lS`2T7$q!a?vLsK4CZi3 z-$F?@VFOJyK3Zo1MY1<4q?&K850JEDX<2PaXAYVW@N6TyrApxbDb@0XuT^=aS;V>5 zq{6_!tf}mg@Y$=^01N02C42a9PM>4VQlpbB9B5Eb(Xc%(A?)+W;lo7Fi(=SXeJbOv z$rh)g=@HkgHK9D}CShk=*OQ{KM@S|PBwD5?1@^Siy^h7+>FR!XDIb5Ok|=RIc+3Yx zd<9m3_pZm7w`2m9lJrtP4^ddqxPu+Nw;P;^GqRuG;R)Gm*97Pv-vBmdxixEMXDzym z6s=KnohX^icQ<`k41(WGA<17N6!=Y0Kxs;I*qX(OhEr^dW-w#F6=6#V5ov8?Qd6Ll&|-p8V=F)4%?kZ+&Y41|t-p4)`@%-tFM7dMyF zc;p*Y;cSV~NxeJ;B%(RM#7gc%2TN2=G6otkw$Q&mihcHIo%SQ!{^Pc1-!%iR|JGZ6 zIzQ-3Ud!*uuZ{I=X>!O~scq`@c-}}@?&SHJ5@pca^WmY;?6NI9W)2glx3sH~%CcIo z8P&S3%kDe3ph0s3*^@~O&!5zH@G@5=E=4~)^$6XjLBuWflir8u*;At_m=t3Tvgsz@ zAk|RkA1@O+))uTxN0<$&lNBmCeQ0-fT5yTm;Rq4Uc%JK^gs`f4@3g@P1_LZSorkBo zvS$5ScVev zYR$*ASKIQAdj=x9hm5aq@Yq#wuWwHbyp zIbSn*J<@^z#m4uvqh)+$fM*4$5AfVXR?RHwXOSWB5;bB)i0oRVV_`QO=BW|g1vYAP zhZ8j=7lA4T^EjW0_8FwC{R)u@@-CeS7AFP*oI&GM4Mo9xo8+d1Hvcv(0=2YCIN|d$ z=5>%bgECHwG&Z!qTeYX8S&|a~`DxG?NxLLnXd4@x5_+&s5-bA^G?&f>8`qX)wN!F6 z+0&;S1tnOGKc_ZUsj{ay^x^ex!ExI3O(yXY`=d3AsXT=uN#qE33<(Ntwc8@33L;_f z<*x90XPEpg5-Suj@L8~Au|5JxuILOEyfe=<%l}a1IawuI7BgFFax~BNkTiDtD%C;n zxFrKIX*x*Ao~jSbj&=jX7ednH&YC;KaMZp2F*9;!XDmYsuhP_%v-)67r=~n0^=oOt z*oPfM-N;SRSEUM4P_u8QDJT7pzh;(FzeHLH$Q(rS2IwkgKvPW!Z)+f4R=e4L;Bls8 z*%+7iNrGixk&0IBUn}ZF2!el~`@?_+hbz*3RQKrq$t{vIia_~*% zi=$8-0Se{}?e4`J@FU5V9h|Q~3!bb`@6;EW$NkiccOc0O!*<7UTN|sokFl82Vurv| zbB!3X%70S?7?smM}X@E@pW6Z zdt;e6qm6nZ@C}s0ScQPt)@tXMZ*eYF-!X*4U(g=C^XoYON0@{DMNe)vh7RenrIFG5 zSoC8{B)!&>JM`X7Fob@=J0$q@MO_JwhC*iN15-2vvaH$uriXEJj1O&=Pf>=Aj6eFI)N@|PL5Tegc#>ZfzZ_`*U#P5S}%rn9@fhEEBQr}i1wpfD+V zfQKX@5^BK}cQ@~hC$g*4s^b8w*IdXLGyBN`m)O*&p+mf+JchvYnFo8b`>`?T7G|0n zKpSXYX>Lj?jd|rPABMu_sHGe^KUz-371FwnB}(Jz>uI|$F$Ks&(a?BMZSw=HIdM|0 zW4|w~GIW`JV5nMM4L~%L243ZHDz?9~hd6C(F0OFCZ$NBs&SOyijU!0FLl|ef{rx03 zm1CIJ2i+d+>*Byh+@)q~V#QaQ8(7LiEOL(0@rKXUHs|82r3W|}X-Z6=z@m2!1gMh zg^TTunODUza?R!Y1azgTxm010YV)jX426zwbZ9Afndr3r*`N)TpKuvYJM96(i>FS% zh*%y(@P;?p6w_H3CO+SS1-$Z&=y%!FZXQ8hKKboERQrFdp|RgKlc{md`C|B2;Xke_ z=QQsYQ4Fmh4F_%NzJ7r$QaQnb!@^MJc&%uRTl zTtGqy=$r6pMPwF7zX}NKcfi>Ntf%NW)vOv)$5d78zAemKPl+5T zy7%~Sd@~l!)9!Y$iR6ZXnR-M-P65#Z>Pq2Il?8Fl<<2kVnLZz$jvY2(BE+GtlO+w{ z>*V8wI?`ppkq@hm5T~2N9>kB}Dm*>v(E$Z#?4t^)&`Z{iOoZ#u;Dc926N?d}NG_s? zB&-r;2A5lC+114Fn3u~Kp1%9__EC`x9!-+YwcO;ZL3`iJBT8{K1Lf|X0d`EHk&S~y z@k?A*)Q5a!VL@6>Y6QRKP^&$3Bf;>{FA&Y{Rjk=Uj-C!enDq^5V#Pp3FoMfV;KF1g z-!aOFm@)Y1r;!lzO(Y@_gHEUmBoGTXc)rlcd_a<&A9o|k-V%)I(`tN`8f&%A(aOPU zNgHa_es~`9+dIcGW%^-Bei-{LArOM$de_emI=!l~>k8WaIq z%ZQuM45FQvYt51>J!ABbCJw1!yWzH+zC6?hz`Wtt)EYNG{#%11ES1BypscpH4qz@K zuSv}ILcI=1!d+Uj$VSLT5l9ggY}aOvkU{@F z=+^@_M25VD9S~?FeH<`BoPi$1TM{21b{dJL- zl3?H*tI+lsoOW)|%~Jp`^Oir!V5e4pN@vVl&0x&32)qqEuTzk31LQ}TMXN@m+U>*B zorDo?$>O+*^V0;<6tv9PG0!p>)DUvN#h)oNv{AAM0SmfJjG`q(>&W^prMIXnbW(RqB7Ic`G z7TVkhjoI6>oCy!T1G8%uGygr|#WkG4rMzdB@z$LCixYZO!__S|E;z1f|8e$*3vRXV zANniH0I60iN>!+cuvl}_;@+voqP+{1)X$!!=+lDj6sF7`d<$T%q)VncROLl`{ZDnI zDA~9-`5Ahao>^935MU=7K1{!ubtQ1X5ia?XEx>u5Tw_V9mQB*C_x?%L%C&IFkiFMP zZLSc30EJv4oEIR0rJY8st~7T&=tuqAW19aM{*0`#Kc%~O`scdvI|rH^;XQ#ILLH*b zCW9lL!P(R8aH8p=dCU0Afj#LioKfjG|FXKUcGb9-Dy=cOyw*kU!599p(Nt!=lkajt z4Kfa`!hB*0wnvNCpEel|b#bp@ZJ5PdcGk$t#oZHT!wg){r7pIh)9U6`c9eJI`15Sm zXKU&wC!?~1gprp3Ij?`$>KZDrG;BwsBb>@85sW!ZDmX3KXr@<;ajN+^Hbx@C*wnlV z&Y8@*&4IUctjyCf3M$xs>q8q&=SbFx_S`&F2SxY?thk{2F-0`4#W9?bUx8R|oI?fx z)y>Yrhx70(H%cMGAubwkduJ>$ybeS=@;7+;XM4ph5%s^uvKg?9PPj{{5|KwDo}5W79)%|Cy651rx)n`U zB+HH*+fR9v2qfbGJK7J!NN;eM%C%3BgrQ6NvyqBo3;)}Y22I~E{P}w$6ImV9zTmU~ z3*X9h)+m0Jl025#_}kbrm)A@T*A_nM`pcAfw3Ve=+9mLuVdY%Gpd*$2^%Y4bFw|F^!mpBKYNyuW z2ua?{##H!y04O0S1!0gQYckTNre76qgF#C=|Wnr2J!=C2ML?&B@e| z->rg42r;QQNj2^r56wTrI9Wtk!$hP{Usxu89%U%eLNDQNUV>O?sSR4~nO@JJq`|17 z(w{&a6B#ZCs)_@8qcnT{E5Trydwphn{t>HvIIk_|H%zK3yllcNjhIf=1B8}LBG z@wsebIfL+fd8yD|dN?8kR#+(wtDNt4D+rBBslj(Xvg7Ne_r!yHXhSn`Z;d?{COF(b zh5H$n5J>N9c>SP}{i&8vK}34TSVZGR?l^g~S(RwV9BbpXMgYB}g{qF5wo8T`OxELc zN8^ymghW$J(VwY65x|K@aC7JDZbuf@$H-`{Mw5|@m~vg=Je?mVJ^AFij1>gBW@{o& z{U}E*)PzNfIv>p^NFymwBAue&ea%im6(KHRLlIiET+wo34{-kFrNFR5_E#<_g_C9b zMwMB_wGc32upb|h`yEpH%{HHz!-$}=^JYrW^W)1DJY}?bzImOw$WIDchs^M3_`Ra<#1L+9p|clL8n`UWhhJR!5F86vl>0i?Z{h9>W_dulqk&zX?RN$S64<@?-o{pahs-5;6{|6uyaboi_Ad)oW%z4)H) zT^%UGT$`x4HXt}`bu*m3$mD2>bs-F;=|WVx!#?}gH^bUqRk zukTW;Jl$U4p}*)^#dbSHD_vcpt=*1QtS9OY3%e?v0%m_W#2j$)yDEiY;GuuxTl#3w zH~8a{4|wSB`i4IW`9cN|M+WdyOhec1sOjwBu=Di(P#T%#xsqj?WK*XpF0p8RI;0My z@?Us^5cQ0&Z3KAeY3?jH9kqs8!&=1G!F$8sPfX4B_DoGoL``NhzvU241An)_iGFS0 zd>MguVeRkn;khrilymbKaOWQl2I_pFn|f)o??z7@Lf&ue>P}zZhxGJMlK()g%dPBD$``{C`8+U6o12e>5dt6Z&~N&eFs5)IKrlVz{<+qv zO+0s5okUXauHbEo>?v!dZd!D^Klb^oygs)^>2!YVbZ$V$q#=Kw`^vw$)#UeDH9kZA zY30Zf<|C}l%RF}(N+_&$m-CiEU8}R|kh@Vwqv!=Xb8L>OUpTx_+SgfXOq-lGpPDD~ z3RR{4s-hrOWRmb0CNnEoM}7Ub98N$4*wHR^7wQ>KAs124Oqjb)aU%KXam~GNya8eBu^n6AP2til_eIR3)XdOZ_HDyS> z32FqsoSdE>4URcV?C}jYISE4JVWDir#)2hXGR2g~qnPZHOJEy&#l7b_k{VBPsnsNB z%BpfDLLpZ&V=kDIl!K#&&7Ag-+!Yj&%Qa}O67hRFfQ1x92hsz<0g%&ZLSqrKAjlJ< zpdN0vs+PfnHF5WQKMq~}C zaPa>apJ@a|_aTI3OV9OgB!+3S%DKv=ki3x1YWL9 z@&s;6>`quD#-Lta*+3-Di5=&Ue?m7E6*! zbQu$UnkgbEm1rqwv*gcUt=p}<8L1UKs&Pin(w7PN^6LO+Gaq^ANOTJ%)M{XYwuP!I zj_PH-!(y{4LlL`V3duy*$npTf-{A(k(2@M;hN%%n4;Hei1XBN!?a?|7-k^_8GBoZ1 zxiEu7@|8BHNgvd!xHFLkak;Z38W%tkhgfW|Sits2U7qxn@YPM8O%Fs0a;)Id*!tJ5 z*wHkoR|F5*och5rq1x3a7p1x*MJkiUMAZ|iW}%dc7_da4j{8_3m%izQ8%QwA^ADXd zH}8OldzDsQn8R`OCl|B=q0p=$&SpEeghhIFmt5L!P|1gf)fR-IB@<07Ho>H&G8j54 z!Nf+~VeoEn@#Q;pOJm#Izq&W|9oGRd2AO1QVw(0EP4M#&EllN$9lZ?1*vAk%_*7ar z^f^+aY1e3C6Ko@54wxV)U^SZqRtO51Oi{I6C*a#*wb}vm1r8mcpJHk$cry!eh4l;_ znSiia1hba%+#x)n@n+GI*JU|Zq7uCdz`#aBBWg2Il0Ky+0NVk~nAmJkdS-M~dOD%8 z_)HMXf-^I`h$pf4z=6abk2|>sJWTF&=e1$7pfW$RyCM__s-5!D%UTzSF8qvUPenKw z1V=9@UQpMd+kS3tUwAS5V7oGryrY>0)K4{a&kl62?A5eu-}pv83i^USj`-d?^1smG z)myJP!H|jBYL;aXyYAOdTAu`!!D4M6`^)#6QxNjr3+QDr+sq5;g;~NjCNG`HcKdAS zEO-)$xBk;>&28LU*VEUPzjq7nsLD=odJp%Wul5I-N$_LH&1VyuvtS1276{$e^GzM$&;@jH`*QUDD*AMBMn$z#Y%|=}d1a9+ZRXMX_+dc?J`2xI8_E>z{ z#IEEZ3*3j_ZE(C(#daqhO!rRxZgJ+JXIDAES3|)UBfA4l-`)|+-H|Yz>`pFx1cZCK zQ^wlfi|BEBWPL7gQD65bZHWar9zCp5v1u zYuAD6ap<;=i^dY~_%?ks;2ZdHlkYh_+%kpb3l;7e!v2is?wl{pq%0pieo@=<=(wPr zRR`UTIyyx!;8U$;!4FSQP4892+UDeq1T-V9($se83E9P?wS@ti#Gz73!d*;_VS*`= zYgYXvu3DmIu@615sS&>Xa4gg$62(bkujV1HJ=mj|Kz(End7!4E6AJFe3m}O+XH9krf02FK|4~0UvYu`n zI6XVjvpZrwGdO5DyBg^{a^baS>pMy&XQw^LsQ&RkLeujlQ%~eNr2`QjSYAxtyRGM2 z5)C=d>c$B`cJfz+6J&#f(}#YI^-#$~xfDU%$kpbSzokcVv3Py};DRv|=c5 zM;_NAmMX&&JnO`k@sdokP#sdL5Vt}gvdIi)pACr%2;r091 zdnB`6Dizy8-T)XTwx?X2l#+;M`}<%|GL!Zt6naB{Fr*(yK2r`FFWDZjt~=l0r=X7I zkmVm#os@idvPN);GxL19Ub>8rcKCx)k{?)1Tn3jas5)#oypW5UJv5vQCjA#x$@;_W$-r`#fnw;2b`w}4QI!&XxoOZ*$230^u!8^7v&?B* zL7-dx1ZefeI?x1n0OXt_DF=#LUTZzt7eewbq%KD^s7yN$tJdX z;*sX0l|&p0whZCOqQ9%Ut52q$3Z}aPBkgXbeDmIDU2SVkiPQO5*6RsP_oye-mon%l zj)8p{_x3{-%}7IK(CUK>wcIx4kGKSQ)ky07_%npNDZy5!WY<#%_;QOm+SCKwKMDuA zk|e!Cden!ap96fB9m$rZnOu7dVznuGL#C5g70aBm*}1~&?2y4}s?^Nob4?THR5XHF zqM&+=+-M!AVc%Yqn@^}EBMsjP_=*5pTIsB?c?EoiSs``5_+|m)OTf&->DgJfDHq>( zQ^t@P&c_{R>1y#`npFN*Kj`MI#C@>W^RUF3+>aOBM5--!SbY{%9oHQH1eCpNuqXQ_ zu=7gfAN|@S4YpU|I$NS~wb49mL<$n$9_AqWc61shoy#VV4^$ct_T!^fX6a z*v5_OZ30hd29uOa(#+~rX(+yZ%iOpzSW!a#%ComJQXZQ3gc8#>3sVfuZofdFv-Ba7 z+&}IsjfUeI0iPdfvy98Ea@C&%0!)?4bv)pqf8?8ZY0kgYZi)o_rpOY;KkMDZb63=f zrM2#I-X`Fozvj!#f#Q3=z%R6)$yv(B|32sbC33X+sQKp+oFMP*oQ0ONAUj|t=$q&9 z_-Q_mH|KK?tlJ?rB56cy1pEFcONaI?tThf&Wp25U?|pknXG2V;_$=M9>EJ@eV6xcM zXLfp>2ANDRR1f)j*=o61gh&ijOB+`OJoGfQNs<2Xsv4lqls9oDMWb1feCPMq({uE^ zyzKtURh;WGt(9cqyqpXr$LRtD9=iN`dTwM6OgJepU;U>%k2G-Q^5d6#@~uyLwR$km z?HkNFWHoPcxy%cPkii^B+A)-K5HT-&w14A4>rk#Qb>Zw_-h3tzpC7({$Jv3rh2eN& zAq`gU9pw>)*gp3!;0HNPxPZQ8%kb>g^b1mk+S4eeTGrIM($_OwRqou*_5~s7K;WI| zmwoi&IsX#Yl!$~;z0@&9bFOTX!)SMf+v#(H;^8V??{SfUZHvirle=%72U+Ute=zQ)vXDK%M6>1Cb-kS zO@ocT)!E+7H+VGiOJ)wlOQIuu&6oM|CF@IuR%?Al95|P&yurj#p1eEX?C`k?C+9Xs zCLG}rS<|z9y0iF1=y;%TKB>GT-5hpS>jNH?BzaJ#!1Pvu3CbjR5_9)WiJ_4^`#X7d zXe1?`v-LGTFdAoU_|Zx&3uZW99S;zNM!Gf7Be#hxaLSRv7*u8wO{ZWSDQ@tsnGkoZD?NBI&u8ec*?$5$zxw0wD^7{VAC^*;XQwTze68&`OKHuLO?ASm>F|HnopcGrY3$7Foyz?7M?;rJ z@<)e9z?VU-dG!9!BP=NIA-AzvN$-B&{(3K0aB1Jpjpuw={w!5q@6hDRkl_a}$l^Qy z7jYfCe;_@ezrW7@iEFqx`DJ2g?#uL-L$hDTLD8J|D@%U6B_~N_C31p?GJJ)iORO06 zc{SrB5|w^Trd~`5FD<=tG-ueKch_N!I~)x8gD_c7q}pY{Kp0p^pK@HajRKdkb?b~k z$W;eg#VeL&VTw$P3zv}%)K(ffK%WB^QplQh1(apokeXVTvh8cGZMuTo@T?wRRew@6 z`)=+^Hd4D0WNp^|D|_gr&pr=+KJX2E^>+p)-~8s=;J3p?50-txg%E6y5rljXhNEN< zF3w&0h9ec2qFAXUgV9so-m^|~GY;zF7p z`5C&ua?wXg_?ufPfZ8fzP?E9ly7UEhB|_Rr17T{8g|w=K98^+(4#UEh?wlrDSy z1xYu>oO&H@SO1v*+NLRiJh7;y7PoCCxxU}&(f7+X>ubxl_i*YP4^+sQCzwQr!-lD3 zWr1jYU8^M``UANvHcrlkiG1){{r&OBRh5H6cWKl#r-QhK zHOLJxG)^++w?@M5$g$ud$x~d+JMY~JqJgCe-o?Q71u+qA1AkdeN-pqu4@t+rebV~f zQwu#Yr$@yy1=@Bbv(_Kvd&Bt9~FUQco#@+p&u##*b)4du! z-D@C_@oGHTW7Ls-Y66&gIX(W=z@}@Tax6msh%@ve`kB)7lfA6pdHBLe>EW=56%b!^8C+k4tXcaG8xDWF?op4_OxU%pnIL>G zQfR$t{lZJrL)Z?713#i>cxF3SxZSx8Du^1{6Uc^+t8?e&^hSrOm9EN2Gjx@*wPPn< z)lS#@<$k(e-R>ajL7p9oGY;bsXpK1y`CFY^Yg~8{veK!&wg|TVpINJS+g2+2?$yPy z#jf;#a{x;=PGqFMr^YN`*gvj3bvlUFit{q4xS4F3k6d8@tQS#9gG zFB#=Aec0Ik=6}BNpth?O>?#b4Td^Qr8{q*Mn|t#yG$Aq+wMIjpu+<+)Ue->{q;rau!g&^}w;Jzxp&_;FOrRo(zGuI^&Tgdp9k#gHxiwO! z^6#+qzmhBN{i6NP?8Nu8+Fv3^F-Ofm&p%TK)UWM&i7!DA@xw&16NV(-XWoKCs_v=Y zROd`@;NNp9tyZoSt0AG>pkHg5fVgTUQwZ~93Z(=rH^wY{cZz380jFyusD!5zZ9YkJwa&TIAY5n%8i8t?$kGLbTAx}>oxWo13 z$mw8d&z1oH6+P#l4J~?1r0if!ChoDSsd1ws(9B>EOfa`tZG(rt$iAmtme6*plu&Lm z=z?+v`6L6DW`$sy1!xjLKw*exJ%7PA`zP1E)zGHF@whHOTiE*dJn`-e%|fk|Uj9l( zkCsl<_}2%K}*tyn)-2rz`6%wz-S+B|UjojIT2dH0`$6iv4(iCO$Ks{HQn`vE13{ zd}|Je>*=G2ZbV0~nR7ulJh^Fn5L?y{K+d5lDgu(C&y1D(%AYL-ol&c)VBj>-)JVCV zHQ_M}%{U*+utrx(9_K9ZsOf3m6(R%HPmIul99L%f*}%p!?76+WjWlZWg+FcmT2w1P zBrJF!qg6H3x;jshW(=w*pMX(LEayIP_3`5m8;vF-V)B?G=6r$0i4kg$VWdp@ms zmg2n=zo<5ag@!&P!t1Kgplrtat{TKqOYePyt2;@eE?P?qLp&Ru)Wl_R6l;o#{j>EE z!ozp3{bS>Q@0?Q;Kh0O*VO`sqfRy!fzAtrqR!5`q-YMX+WvjoDuFH7HGY#;YAf++J zA@HlfXZ8V2i5fj)!3a(Y$2_HsX> z5r4AW8`yvvs7*eQHAgk#CrR0e!x*`d)nd4+jBzG?7_by!IBOEs7RgKB6@?wMHJzFuC}WwNR3`q@EOcQ6(18zmHkDrQTZ z?$QwID9{cl%NnSEzWPm3I$}N59$uGymBDW$FzAN=f}0HaReWI z$4_CZrS1GjzMZZJ=NimwjHS_YAPYR#`Livyc4O3Krl~40vIv{m(sJF+;{wcMu|&i^ zL4oAb14iJh!|E_z^XQz_A1z2L<#~B-aKXJ-e^<`ipSHT23B{3NwK>yi7whYAl8Ab@ zi=k_^s5!Zqz|U_V!;MVfXxHu_cnFN=!h0q;Y1H#@vq1~=rOZuY=VSl*q9sBNQh;=tEf9bO^{rvwUZieLve z&NkSo7B)6pD5|`oygH=l&Z@w2>0Mks!WN}P$@D^pO; zg$Z89%_5mMC?yr^ta{@%&kV^De;*4sv(3`Jm0g9Jq9SN0?^mh?Nv&+iA0wKb&K}ri zEQ#C{w$G!n>(coigAM}?9D}Bn6 zT~!y0fUfv>YqH)Pwwqw1O@_atu!Hf{*{DDMHv%urE}@_fu{hi*RLEiyK?<7MzB21h z4*~%O#8tX>Yf&mES86n!ZD=(7q=Y2^OR5S0xyEFJS@gP0Bb+bBEou_Ncg%xV9 zNaM@<|E|;Pw|kI}?a8^sW>Yswpr>ZH>Z;o0VLm&hHt>g%3fPkwUeig;T`QcpXBjj) zTN?6QZMm>i%@ylhkS=6QFp2o=oYcN!pI(_B(DM6`^LG#Db++aNOJ!pyq9{w=Jp!bO z3cNi(z)mj8UF(Ub<7wHO=JbEcyGW`d=;{Y5QQ1wQ8vR_u3u3MA^u4|o;v^V2?!ql@ zT55N1$>R2J#5-5J$={L!dip$!h18|?VU1A;YD#Eh0?yv0W(7={9wZrON z$lN!O*UwNTagZ{po^vYP#<{9SBvRlKfN!{O4{1uFHX}vvJng!K;6^f7m_lx}yub$QS|^9g{fWo3x5hY$}U}>R^#0NuRIMme!Wgt$O!~ z##S9>!G^VxhzzG7FwIZU60G<#N-LJu_{u`X2B5r0+lm>^x{JNF-dy)UJJH@(S(LuL z<Wym+7?iEU##O0_M43fjV`@rNYY$+a_nNZL4!$Du z(rx{I{`n{EZEKLS&LW+=*jU=N#*EQv{YMOKQK1vz()YdEm@mAq0sRQnM3u%apvwMi z5hTh}1EZf0s+y0~8$o`KdKb6x39|OtQjhgAk6LQgpf%*aNJ0-ge6%|YMwH#LM={z~ z+9RNKB+rL?R|={wG};=q5n^%()XPH+-qYp=vLwi0dqjj5 zkIptL3ztCd6m@`&JNmm`WdA8pzOq2P+E+fG2D*{R@_22c0zyeD`pVW%vvaczq&tE~ zjY<_PbnY>73GV2Fjx%Q>^9MUa7BH0VZKX~i_`b4QZ4~Ac{$F)1uPARr#X?l2kY!Fs z)$?r|!$>07HKIW&5&h(R{Y-du_N{edVKRm)VnY5!&tZB_=pFgwc;h64Pf3OBtBlUT z{x`yXC;KRkYa28!i+)RkzW&QS<)Fu2*WTgePIqNgYzJ?OWfp)@wp6;w#>}G!p;zF+V>Ocwf{5r#PBzHbs*xFVzPdyGETPOMaS)NtBJ)aV9 z>IGHov>47>T^&19$!Sv-gUutZnLvx>%7bN>wtilLsha8gXJ=3aOP#xQT(WEM17i_M zq&Iuk4}&aOz_9$+8C1_Yzm!Gze{-8`GxMmiD7Vn?*&$n#4Pi^=J*W4phlrcNVvIc~ zh5vUfZT6WXDsR_tUMD&m$+qK1PdkLavZ6JP_9K;MIwqI2uQ_7qG;P_|g8fEb+RV8g= zM9gSQUNte5WP+jHd8iL4M>g$S-i$i-^gv|Lz7gtBbt1pJ#eY>d@o`wr&da8C-_u8H z>sCKU7)t4J;&J&cJg(J+Jaz6vbm89P?Y}*pbsXq0sYCl@7It3^#Z5y0Hh|0dhqIc5 z;2rrLe$X~DH=#G11}y_`i*XP5Za{(2HbNns|6%L4=2TL27H1=G92_Hi8N3uSfsMK1 zV@Nw_A)3BE@`|;YiNXEi)WMY=Inc*8-h*Ip-UUW<>!{i-FNiO?Y73al%dn@bVRwtYTepTQY;NiZ0Wp9yHKKK zy;|OjQ@iwr-F&{>9)&wO!h{A}=-lVYouMeDZ4Ei!KQT(zQ-o^IB9r7|@O2aWo!2uz z)O+)pP9p8^mhBlOYO4P$>UsI0Tk3D!-^MZaCZE+x!f7pJi2Cy*p3$g@@&|6DsrDXl zySlmQ(AtfSGVy$Q+-+G~63ZbQ+N&e@3$06my6)E9sOSYjWnoQ`JrAzBgOGxiG$%I( z<(a&qVaTnLVCBZzwDC{B(VoL;5*7q^-hG#;#cLbJ6o&vCUm#^&U${+h>h zIpa1+8+wyapB?TGexZ$Jpu=2RZ&Z+I{Q@V-5E^=Lk((tPJh_#J##IH%B#epcj)M5^ z^Ow%EtzCH&FGjUrGB)enStEiNj0VJWMx#D>{O>0GF*dAqqsbi|V7{2oW>^0`-jbU# zHF-T^^cW-N4*u=WJ#qDMTDnp29X84_<=m;`VKILbzWBC=j!jRoHua9QL@aCU*$$Q! z?iuDA91Js-uIE#8?D>HiIrPRtQ>Ja0WvLESj^Z5}vx!P>K<}liZ2Enudj{~@!@?Cq zGg$H;AD>0D#J$7Vk$HrPno)tO>@FRmr50XsenjKlU1h!eVabByh>w>Cp0)`KeTmL7 z*|-&w_MrG%H_+)-oB@vcbdzmgs!=Ijr`K)*R9ZHq?O994U+M0)O&bPG?F@sTTkY)` z&i5F2ZNyt!`<7Lk-nl*Mz#Ulc=P=)C<>6?XsYqB*=MSZoJ{EO{ooaHdwYV_-?2UDw z(j-I}bnn9k@R;-HmV_`MdlpFO(6l>|!Fh8eOWEk(x;im4Ur(44UT=#}ZwYw~OsHzZ zLL5qNiS20`qw9eTTN4N91%kN1eu}8eG_uOHV3^1#(?(L z!TyPXe$)6)Wjsok+_0gwOL(h9KOgVZE-83i;hZH&Vtwb!sLZ(Bdaj()8+qd0jl+BK zrH{&7u**tPD|_x`UE{=E+bVRtE0e9s9YIDGccvH@evfNbZa!M(-(yqqvmvNi66}gc zAWqyb5ITGM*93{VDS`z_B9-Kx3*&cxAOY2p#1^NcWdxfg!a|aJJLQS6=+`u2=c25Qgt6ur=jiv2pqWyj~SjCG9@54jk z8`}cyZ(NhgAJAJ}9;CmTegkZDW;c?zXJssU4RjNWUZf*b|2(zCkC4mY_P>4o8)*l_9wKcw9`#uSVh<_#Bz%4;h=#Q#>;A7bqiiqwSPgjq@lJ`=1Wbq^X#?7 zf}qGuSMD=f3bxyPHEq0Wk=yFt|JaSUCqH@fn*UK(3WIydeHSK{2mWx#26I}rwqqZ^ zQ$QZLdwR?H!{1-#-`sJ{(SvCNR?Dl{Jw7822-Sa(@o@OJxbB@iEF9j(Dz_~J9?#QS z_VyhgDm#R`-Xnhuc^tUXiFM~3x80*{!wjv}#-#Ni_v3BH^ zT60+a--BC|J35d7ziqMN>Pm7V+-8j#Q=dl8I`^#)7fc(#F|P&RDn3_NhxxF^?tx@5@&cvd@{yy!IPjBMb1g?9|x z3F*jkH4OZb81fx0|Jh8i$IN`WU#+JV!ItCl&-`pwJ?5Oxtg>5w4&X^W``hW`kJF<& z6&`#mCf!*S_H`n`w=~a$ng{whN>Y1_@OVf(2>FBkCf$Ag(pkb0@3u9YdG%G*zoGI9 zb2ip5uEUna(dF|aKW;fxO*xJynKA=4Q0M`DUBoGV=a(Pme+uANn4IcAxcb$9uX2P9 zeWbw(Xix+Hl(~WQhgu|)N~I4A*_M^En}Ez9TM_M%_D1brXSUuB1<}GptbS9 z0#9ikoz7YNh~{Ln8B%fw{b2k7#-09wyK&=Z<}Lr;Vg^l(zjA%H5xAWhPKM23Ia!YX zX=_j}bS>0;4Nx2in)H*XU($;ST$Mj|lPQBZvF|1dt`^*663&kT_#-pY^2>-U*Pb=_#au=`lh zdo1M?Z|&*YA#&;Gad8WO(qU&0*~K*6u^`>sO;C1_ta354JE($4FJE4(YkI$}|A%b9tJSm%;gJ(tv>eyR`PVjTZRnOHA zLm#64F7Q{Mp>L<5&xd}mx8PS^o8o%nXv)3hzsSztC^&w%j}3jzuB;;*ww5TV$Z5 z@w1xl+5ULv(%@9-Mw5J64(`TSHuKU6(H5r*(kXN~sRZzum7dKe^GYym z-kNwku4R*TYdC0K83I4_hczFL*!8~jKs=W2^XUPq$0+OOG?p%bwOWaqj!j40a!%KQ zV{WsF&o`UgmR)a~sIj)T7}W&wwZsvwFd|owGQ!no6hstqfz>gZj!4q8*Z`9ijjAV- z^=uYExKXxTH!-(&)Enz4UKZZgVIRYyLRD3vst&N%z&Z!%p*id6ox@RnnBTwCAnlaE z37H&h9zFMnl@>M3^J6joyg@}9w}<;>zYpreaxzx;X7|{-$7coz)LJN}=c5f##^Sp0 z|N5Rd8me%!%Yxv1Q((lWgw5ZUp|GLRAs})Jz6k${n|i#F^~lF8tzRY)xuP_Yd`$7j z$)_xM8r#TY*PvTTMSwgpdBlC6u0xeiyUz2$cWxHa5nMlqit-=#S-oilY-bCU7|6J=@>D;q8f zZ)Y5;FjwA2KQ6qu=Ro-|1K{}{r=P1dSDa}ia1q)`%i0ti}gB?8J@>9s=fMA!MOinutIrGmX74`@Qdl-wk zfWce<8j`Wz2v$!K#cMuzsFAx$Agv9d)WsM7|bG@wE<)X5?>6cT8`H1 zL4J;EH;)MG?%(P*Rdu)NR{L)ZaBssV6TQgtY@hK<7){%5!6yrZZsi475Ot(%VE_J! z0+hKqki3kNla@x5i09q1iHM8GvI}`adz|%vU0_e=_m1Q^B7Oyo|6}(dOUwUpI*wct z=;o+%9ouRoD!v{CU>2i7e4HFqqQ2>b#Q^PQ*W{*+{Amj!m`EX-H4eJ%vR}k=218pR z(F;5BAlXu6ox~pGZnR(Q4w@38Z9-EFAed(Tnr~kFhER8Ydk{W7?#)^u@=>1vTk?WX(Bvwakek0Jraz%S_sGt_ zD%5p%7Ke8YO<5*rN-sqHL;z)=%NG`_xegVAgkq3PD2-?oSJhynbz^PN<)gU9Tl z(82!ezv*)j(Zu9!VDg1v`mLE&z6i(lZSe@Vhz(%+g~0gro+5`!0Ie?s?QcztO1uJW zwxZvFH*dU>6y=fC{z9PldQXePv5dP_K7BW!jSUcA@+QGDkdVm1XX1hGvT7u}TjI_y zj*bOJ6Y3uwU(a*#{Dx8g!f4FG3l|v}^3ff-PHABN@!sPVs3n~42+SciKn?FcQAPy& zt|C+fxQ30i-&7cpK#BQ{X2K^)hcS0BQn-n*8Ty z0*syakM>TD>a8~#pq*bBjhT5?UTotiNH+cU!q;WB{Z-}1stTNAZ}7a;KYd=_G1iLC z%|=)M3VezdWkHFGr>NC}zh?tdi8@qW{c{eRo2qTw!E9=JucH=Z56Sz&-e~{O;$FTY zM&8npbHh-tN)U`7pF5wEzjv63I#2|D>V{i69o#8mL-AH&<0{-r*7`K&ZZYu(Ese)(`b61!_U>(h!I|FP-h+ z$#klSH*DL>Nz1i9ZCOLvqTTC*6_pRyl(BQT-0_Cic^10qD{dWNuBum6(i%&m1?;-6 zbQj>R;=>)m&N#^n9K#k`z6v82((U_=W+SReWEUv>A#RX7xkup@d2vNuI54kT#Pgkz z`CK~?cgLX7?qsDoQ2(?f=2Nh%)$vAbV01wLWVvh+sj_!gRIID6`Hge!i%P;zl*a$m z)%j99V(N&buMABtx$_q1i!Z83P#dw~pM<(dkZz=#qJ{R9Y*czgC#q^5f9aI4q{FH7 zlAf-r`RL(&hLZM(kRGImVu71=t{m3n13z2KbN2__<*w=x?Q`f}K2Qq{404ewBSH?* zlYMO&cTe?7ak(DVE@Z6`X_{s{`qUTI{&~8o{M~VMS*f5(f^dX%t>EFG9fjA>MHY=y zUU_N1{wbBq7&6<83X{R0h?xa580_pxrpKxNbNYa;(jirRJ1opqHmJ3>22Rgl61?D^ z^rsfUK6N=y(RnX5l#O2BR;aijh&2VDX`poCSy7P_%$lSDB#U!f3ygi-$GY#oF(GP4 zz61MxmNASD>@S-zQRD=QFs0m1Tfodb6xJpP0&*Wd*4{>2)|>`%qj*Hg==gxltpUr9p9>X7(5IxEz>ONpe>`1cRIl91P8GOsT2Di zDy@CEy7CcJSK}R(w+@I8-c>aT+*b*9M2y^y+FBNyx^yFzrlA+_kyoE=+B)4qRa2vJ z-wd_(@w(a@TTdvi{#8`*&s`_(=)pCL_2ozJtztYuBl{>6!fDWR<2}+UQAh8oWL%&NI*=PLAxs|q2@FINIm>i<1Dko8L8;u!ZU3;kqOc8j9aWhJ zb_Y`aqE`Op54dFQ1|WfTwK_sP1&a;1>}E~~DmQ|cHkM}OCV{(A|` z+g<+rS;erc^d*6O@opD*X#J?NQdOLTg0=&)&7}LxvTt0-f&`Kd2z@j+qLd_i1$sq- zC^QTCf>b;{n^3a{++fd#NWO2~P`^0Ut}w{hLbKXX!}D=qt#_CVIl3jhC@<25=(Q@R zL_pz|rWwaplTQ0`D2Z)eK-Yt9W=LVRz_8t-fGsA{x%gU` z#x=QSvwPxRh7w8&Lg;Z90EP)DID+F&(SdYEv_H|o3<1rgMF-{|uv!E2>o)|}aqBj$2PfTm&9$#7 zSz}l%H#v+lr#!nc&>5Fsnx|i1VX`BDbqFz;%_bu-7P-qXr`^ElW;Yt^{nTc&8w`>w z|FIW7{UjQ)mRB~x)-rh`t+;|JeY&~rCaJKcj%6+5G!u#~T9=Y{3&pQ`@j7Z7$i?)G zxGfMAJodT7Dia9Y5w^5hSB|yY8pSXo<+2TYZpBZ@x+=#7>eJtn-MiWD;wQ@7vS1mY z0vGuJJRVRB8D62TpL94mzp!%>8B)roj)W9-qg4MjeEU91ux?nIut%I$XAERlwb-mJ zUU##Z0UoGIet0HP{MCcWhc&=uUkM6Z#%;Ein7btR556M76C_{_)YB&w^$9s8{~sZ1 z@I)m=YJ$Q4)H(?FcGP~f;`qL;r4e2C`DYEEP$p{`ybSt zwE0Z^TFe{SO)3ikrV{J|a>IneKUttmTv z$E8Nt5`G77{^%2$%K~1k@}4(~YyI*psTb&-En8Jqk6dE4DhzScP1SO_r2Zbq(~;2tmnb*c;G6&`i@s4EPH z5!*Et@gKM;dFY=Iz<&FM%HTXPp9l6PBbDzWH7&0cszh%6*91Wg7HJTRM$WnDNX{ z`>I+FV=#wWS`J|_hrtnAI7`b|Ye~KPv7W8B>JzvT@KmEZ07+UN{Bhk-Bi$lVt1S|G z*iMC5kEe+_#rlv-8Lks8-iFw(ceXng}`WrX*PR7Z$ z#BT*&YIM3rqfwGNzwa7{97i-7j6?&@vUl$x{u6J3EO@`F%ptaz2~BcM2k^9zHvI3KoEo)^S}!AjBx95t0psJ)QrSI-90AXmT7U1b)+Ypl`gn)sH|sx0 zOGYDU8N@j1^&9q^Yv~`>e5|EDetNH&z*+%C0lEkQ4(;mA8Ofv_)bG4178>1pz0o5S zU&ZU#?P)qa)!x2~&DsNg7S)}#^O|Hmd6rG+1zjA9cW&I?!ii$B%R5q_lXN)>Osyy0S&s`eam2*G3{s*9> z{Xyr`D}@RnnvX)4)|blp@;`ulwu*G@mWXAfjOsKunhY@h38}#7(CUmff%FNy?)$cj zOvc5wwh;HkO>K%(qF7jq#Fni;&11|XXqI^yH>9SYi#%>H9P8gdIqs* z9#`|=k?`aHM*p~{XL#%hr+s-P^28oQ6OB12!JBsF|B68mJ=r6BTK@>v-b_e!-0?$r z*eX(tjlQpODr^r-o85YRt}ktiZr>=s+HA?y_r&XW@7#wce1*^nUfI@|TL>A3K!Ip8 z`8e1be&%1#(pXj&PpIcxwCkizH!I68cK&M_N2C~7EQX0XqSRE@H~v^w2VS7@*l*F# z;JDcJb~#^uwD#`>R`72c>E#!j1k`**K_%1mxRbcs^$aje8>HLRA8J1|_0vIwW~N&S zZ?oUla^A+jZ8Oug!uLe)fdbmV!LEI7Sx^zQcI_HC;(?QzBp}=H8>=a2gab4i{FeGH zQ!nwKAMe6|dK&-a<-`2%`KK>m;Da9RHY%64)*|y+b!fACTJ<=)+NSS|PCeBg4(roV z-DlO?Bc`#-*nS65C1|ngs^oevw3mb@)pOjZPJiPjIlhL~{C27?|Ekt=b)#kPUQ7Gb z7t}QlS-$r&`Sx2zpYiRtLFbFjY<<{UZyUi?*`3q`q=KEeC&C$F1}wQh`lyw1^ytUO zj#9t{{KrR+Q7qbe;PXA$T?IBD#`q1X7GO!l{HM=+Xy0c)X(iaON=gdj)Bt-cn{c;o zf=NCePzGeADkdu`Cn_q_l@*z_YyG=Y{a0`8flp2JOgd2srwT`WW2(en*rTe<{Mz@e zuHLFUh%pP$htG~i=1x2G(DoOt+$l!lwKEkQ8cyip| z$!Gd+o7zlfnWbXLYCQj%Tl&0G6ur&Q_w2yIwv8!`%eudK;}`U03p_Vi>85?O+;%fBNiZTUq!CZt|z4rKte>I{_`Ku zcMsip{dI+O<~rW^50EVlvH>84ANY*tf=rZTi&fPXqs^_}`4p7Zn)*nyk{Qd zQIW-);Ky;k(W6C|(n^HlYl-IZG2{_^B2khps;()Gi(nmiIPRtHN}uKBk0jT3l*Vv31+s!Ysb6UjbF~shqt=PF8Fk|3q*Wm z6H(X3EC<=c_h1tx*`n$WiqYm)@BE{4D_2}|Be&u?L6nJAmCQ6gR=UCdmFds=ysV7& z*U|fN?#<-eD~W9HGv{c}j9d?X7bT0TJ1AD!sNCK2&m;2lkW8!%s!+54C&`jfML+Ij zX@3n-k}ZnyEazgBMIF1gcD~x;MCG`509hqblFe4Crs!>K_0GR=(Dgg-`M^g$@!9;s ze3fqkJ>--q$!056Q}kESwykczFmyHV`M^g$@!9;se3fsCS)2`iY_f+Qvrm&Um1q|` zLvG;TOO$l8s+kn|Rdi&lcmB~C(;wl%51EgaCuc0`L+l(s4>yE9VooBdnvyBZ`(92r zW_-=E|8bYj;_gF7i!HUZPJHMZVn^-ky0_tN?%^E3ID3S#sPKP(wBd&m}1GOL=kVkPURcv>rnvOXGo zv}^V*$(&HfkLlBW$bUphHY@s7MD^yk9K3<455FgcaUs`5)=mWQ8v-hy>F7Ck5_b+G zoY>%TLE=rI(z6vA35)MME!Wk=zOyTi($iN(JJR_X9OJRhUe&B%2qpaf6#oOs$G*g_ zQsofPt?oxl*%YDnp!gU^|P^PbOSt|3oD z%-`aDkkQNTTK^Fc}l;vtSnH&PcN=FgU z`?mRB0v>}D?|HRLQc;seb*~uWiLMgY4UV}nM!hn5a2gyK_;f&zoLrX4XsBmUK@xxq zbZQm3Q>S*%dZi5z>Xm~8_=DxSCGzh`(6`YH=vAk|LE_LPyh2JBpfqWAVQ-GQosCg1 zcZHg`d_-E+ej1c#Fs8aQ>Q%Xea=pqQT^8IP2|BxsNhijf$)G9*hUUDfulQ^OX3ha@AInm{L&s;E>K~>0}69D&eX~uT)OF#(TrE@L>`7 zYq?e-fF=E9)7dRPas|3Q8FiWQXtJ71-0DuoDumpH)ZPUZk^tzm7O3l4yL#y`$ZOLW z(-@05Jr8J%4-)!oc;}Oe1k0C6Wdn2lD{pE=4D%T>|F`!58Y_Ie6Cz? zLJ8^*EeA!_xem_XhGV$29U3pAgYsLQ${tZf70Pa#x<{>sM^sCud#U60xFQL)KnEwL zAHj7V^v$D7p)MiIGN_c53}*%lI1QodH~>=m1u~PbS@4E6A-_S=ZYb8mF|svutyzLj z12Z;+0>gYdpoe~!?RW85gElgA+rnuvIXlke+=Hf7TkqzR*UZ!T3$Xl3pc_G%+WyLw z-=kp7r5C9J3GM(UMpaPYC$oZ;*>iSKHJ0N@6vb}O0g!9Ijts=A>T*LNKZAtqST_y$ zxJ0?WQWjR7nYsA?f1`duLA&8gN+Kiy9Il%}Y3kB{KpScJ@Uaf!`Xet;7ApI!afK%g zIxPL*)Hzhr_!pf!Q@8ZO`x_-UKdF6ObAQ9A#$Kl6_xMx3y!Z=&K53~E#w++<IZ5 zQlAI$xUv-bo;-lTY%TnQ@0~8b7r-glbPdMAR~?9`61%AnA^7rk`!E+ws7xnrl2_8m*dpHVt->ypkLN+&OCr!EV! z_8svAPx23*;aNAg7<=96gMSP0*@9B*EESx(r9yIjsn9epbs-Oz3QO-3hsUrh!6k?f)Ii*L?8+=h(iKoNJ0wIkO2j< zki#L!Ljj6Vf-+Q~io?o1TK6+}z!Ow>!5cpCg&+K<0#1T*w=SJno%A7}gMD+jnD3@o zlYQRP$fLXS{KwHyNIsl9^DCm~$G^n%9(?Rd=KmX+A>Z3%ZvD3sJ)2*4>toe^nT)?x z%-A;_`}m8D`$b>Y2K8BV>$`6SiO!XO&~_xb3(c>R`>ci zL|tep?lB&mid&|kpNBIivSrA#XMs?LzLLnE9Ng>`M_9Z+Lz*nPKX!GKo&nf@`9v;u z$%RIJaVt@wScW4!0ucHBghb#$4a)AQ(`0Nn4)%D#G1vqmse$ag<=t|qJxQs|6)1ru z==?)a$3N8R99U!i!b4v%Jh zECWZ-PrKF{FJ(+mb*U<&oN$d;1U2`@EOrP1Gd3K0QzS{}(TtB};0XF@*IMJr#`Lyk z9Y;B3ba<%djalpv0=~Ho7PVGKI&wWOujGdqFCJZbdLfPD1=QRU`zD?7%l zHB$A~VJhoPZa12vpLXfw%}Iy>^rE&_RBIx!z6k)OQjhjWM4Gh;eQ;Ci_5IL2N=xe1 zDU!I|P>dPI%bH5OAg%R%kj6dpJZ2=lr##9$)<%wF8EaX&+B1?BR_%m2{n+(5%PibW zS)(UgNcu6=h;N8aHMIVc%dE|lsq-Z2KTD}Q8ats|HcytGm+Wc#GqZ@c*4xiNvLzgK z>6B*{o7pH5Qxz{f`@~WCS7)Kv-z=A%H+^2T+4=*3lF3t}R0}=X5v48NAxb zCT^9}jR=L#)698LD(*q%b`~4UbabPn97)(S6lB2bpVm@K3DtA2q7KiTQ;CLvP`3~e z>J|d}x-#0vx1b;W{A&Nsa~P#4L5TvlI*Xo@gu2z_Ruwir-Jzr|H3%FO&J=HImL zAdc&^QhAh{BqW6TOh#Jwsl9{)r?u!cTw>>rpz3X+xwaChMiX)4?s^D#ZI*Yb7{d;i zK(R|RA}JghQ>$gVF*vL;?_t;*>F$(7X-?SAVJmT~<7g?F)37DND`{5G{#Qqseq~E7 zJv^4jip|Cc0nx4Vc@D$mh7}0pb<)+@B#!|1J?KgW^~!s#d1>Z1$*w$5v@wsBP(?0t z-Q1BxB7;?^oT1i8^DXMnSI*t7j0{0b6G7;^WUUL}nF@y%PIn&>R`$3($S75nT_9Q4 zOC`d$d9E`^E(lhkvdKs~Mbov#@lnRKn$;Z7y+fXj9;MPqOD+h8{aJI^zXG6B64^-N zGndq&^w`)mec(;WF}CQKc_Kbuv}jtT_(d-}H3Vu3T~Tih@ZLCNrui54nYS8|!2rRG5@F(_nIzY>`IM>w3N6 z{0MT?9iLi~mnyq;Nmh4u{n6=-E@#{W2BxR(&0TfPxSGB?D}72=niwSOzF_65WQF*j z$qoF^8nT(lOJ4M;EGD`~G+k|W6lR@WUmr3j|LDI)c={2zR}%V-;Hf0k^CRlNrMMdk z;5xV^QQVf5tB@)oip8^@WQ<2KyD;D(T@mi~r273Ux(M#> z0Pq&4Q3L4iUISnU5K}66g?KZ3x-&POkj9IZusFuoqHBNd7F&y*csKBs)ZB1%PLJ~g z^e=!i=TNuZH+it;*dTC7Z$Ahr;4YeI1+55qgx{fShXny)pB6qG3L}1-bxOki z0u(|7PwCC4{4lX}g&&c|#v~#L_Ht~n{Bs-`euS+pByP`DL?C?QV<`7_g2_j+JamU20@U=~<-5rTXduwbQKJKu-XxrBL&NGo zLRNP^!`oQimNY&(%PNF9CMn`dg|!kA4@PaR{EMb7oslX+v0V{rbu+%v2ysVb%dPk| zOul{PVH&~qqK@Sx55K>Dn*C@v@oT2bSO3{ZOI<4mU^*G61V3> z1e!yl_RQQCi7gDBugc9F))Ey`ZBdpdlKWRZ85JI-0t3FqE4y%WB2g(qJts4h0wRZg z69|95qk)$T4$ByKj-Bi0X;FR#>q4y1IL!kJZT`(#p9- zn=1S`lneRC#Q=$z!=oX_LI7)jA&3C1`VU5nh$R5LPDn{b)|<~ab41zz)D(ut2vj+v z>^;<8Jsz&!YfOi}F3i-M3%=rT!3tQIca+e(QZqRsh}>hAjUn_6NqiigfeQzmNnYfX zbb|P-DXGZZzY)`;hQk`T(M>DCNUen$x-QY-aDqdr4H3#4wT@*U!dB7`6N3SkhP*3F z#nv}Wo`m6mHGpTpNg8-bno8sEz{&|Lr zh*{dNkxouq$PJQdJK(y?I1DSm?8@C{sR!ob9N>AeExMh5g8S1JteMXm{q+euTy)DD zh>bTC^#X_PUXT3DYE^D4L}Wam$cG!nX2)^$hwg$_iQG;Y1J)=cTsUe64ichs{V6bQg-e%0Lt zkQrAj=JF`Kz}dVxuIPX~>Kck8_!P6}n2sc)m{aW;eM$FTmZAR_;UfcFDx|s+`*;Ww zfAX8`5|j%?b0()7b8c(YT(q0Cwdh=n*b`g`wbHx@;to2Zp&eu`#uJEglWBo6eb!Tq z7l&=ZtI*ZRtu$p3GNE8fu?C`>FXCG?cpjMHGjEQKP;#Odaqi9!+3k*6Y*rg3(=&WO z_VA9geEv4X(Ew*eD{FRHc6-EukfnQqd7{0(A2{P>(E_(lS28}D<6GN-*INhNpuw4A$-fLDNd5P6S@Mq%nu_-i5a zy0t3gsfE&FJSEFUJ#=o%C`kVOe*Oc|w%(@;`>2_Iw9I17ZJ>R+gap2TGEq2!#UTh@XG z@Ly1?2s(rn>L;J-j=*O7De6cM{DLT-&4bFxIBUlIdHCYI$}$c2JVc{&XG1kS%MXW# zWgPCy*WqLNCE~sF7E`xK+= zKI-s}&@IFhmCAe&WDj}r098btqEobz*kHz#8gn+BOVfPmC_9KBMD>x=3I%-;(*RlR zQCGm`T{)a_W*q8MIDj1-IGsUG>ynSP0#P#*@~po^GgtWZf(S&4MP+>06UbYT4V=ks z1Xcmc-~fJv4S^^!B5@W~a^W6(mbrz<6vhb%P8Q|NuY-TG5uVIHmJx*XfahyZvQ9<3 z5lI+=Nryin2qy;d*hA1jEU^UHJ5Y-Z^^kM%Y^Pl0Qi3u=NYdm&C?Fqa1QLqMzUd`Y zw?2yyU*SE@_@Y8Br&wjqsscpub<}7_B@*)Y{~qK7L}uU)6@}=6)pNLV5;h$ND^&!> zMQjm;XkskoF^j!##1IlWd(lKUT?onHi5`*f>Fg&c!2o0JC?29*@J0sJh^2B4hnNx< zq>fNN83QV+#3~w~>Qwgrr`2Mx``5Du_^ayQNlO8&0&pY1E(5R(z_9=Z0lxlC$+cvI zAr;oYrhc#k18CvPH}Yu&;Lu2rMF4WP932G`Q%%nJ`V&ycc-6D5Re;iVxG6_w6_x_QofKuwOwsv}WoGk|UrUw$*=w_yuNWG%bkoxv*tyhK zHq)}^&Rlc_8bUVx(Fk?%d>iTuW^lWYrc2D*)QZH)#JOl*T$F5|9(J5JH)1c*?2z@u zKXb9{OmR}Qk;#zPUAEe|%$*~WwWb;Bif#$Y+O74kliF6TPDKCdXMEUsHPV!NHResA zD@pWOWI}lk+1Z}ja>Kz*j!2}c>8;BQiA|^6J*qW)@W%0uP0VEx+ZHGj+Ek~#gRhc{al%*i*}Z;_}C006&PZD;@h literal 0 HcmV?d00001 diff --git a/packages/origin/public/fonts/SuisseIntlMono-Regular-WebXL.woff2 b/packages/origin/public/fonts/SuisseIntlMono-Regular-WebXL.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..894e802874713916136ee28874493f60c60687fd GIT binary patch literal 17284 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 0.999 && hex) return hex; + + if (components && components.length >= 3) { + const r = Math.round(components[0] * 255); + const g = Math.round(components[1] * 255); + const b = Math.round(components[2] * 255); + const a = alpha ?? 1; + + if (a >= 0.999) return `rgb(${r}, ${g}, ${b})`; + return `rgba(${r}, ${g}, ${b}, ${a.toFixed(2)})`; + } + + if (hex) return hex; + } + + return String(colorObj); +} + +function isFontFamilyToken(name) { + const lower = name.toLowerCase(); + return lower.includes('font-family') || lower.includes('font/family'); +} + +function needsPxUnits(tokenName) { + const pxPatterns = [ + 'spacing/', + 'corner-radius/', + 'stroke/', + 'font/size', + 'font/leading', + 'font/tracking', + 'max-width/', + 'screens/', + ]; + const lower = tokenName.toLowerCase(); + return pxPatterns.some(pattern => lower.includes(pattern)); +} + +function quoteFontFamily(value) { + return `"${String(value).replace(/"/g, '\\"')}"`; +} + +function toCSSValue(token) { + const { value, type, name } = token; + + if (typeof value === 'string' && value.startsWith('{') && value.endsWith('}')) { + const ref = value.slice(1, -1).replace(/\./g, '-').replace(/\//g, '-'); + return `var(--${ref})`; + } + + switch (type) { + case 'color': + return figmaColorToCSS(value); + case 'dimension': + return typeof value === 'number' ? `${value}px` : value; + case 'number': + return needsPxUnits(name) ? `${value}px` : String(value); + case 'fontFamily': + return quoteFontFamily(value); + case 'fontWeight': + return String(value); + default: + if (isFontFamilyToken(name)) return quoteFontFamily(value); + if (typeof value === 'number' && needsPxUnits(name)) return `${value}px`; + return String(value); + } +} + +function toVarName(tokenPath) { + return `--${tokenPath.replace(/\//g, '-').replace(/\s+/g, '-').toLowerCase()}`; +} + +function build() { + console.log('Building tokens from Figma export...\n'); + + const tokenFiles = findTokenFiles(TOKENS_DIR); + + if (tokenFiles.length === 0) { + console.error('Error: No token files found in', TOKENS_DIR); + process.exit(1); + } + + const baselineTokens = new Map(); + const originPrimitives = new Map(); + const lightTokens = new Map(); + const darkTokens = new Map(); + + for (const filePath of tokenFiles) { + const relativePath = path.relative(TOKENS_DIR, filePath); + const content = JSON.parse(fs.readFileSync(filePath, 'utf-8')); + const tokens = extractTokens(content); + + console.log(` ${relativePath}: ${tokens.length} tokens`); + + for (const token of tokens) { + if (relativePath.startsWith('baseline/')) { + baselineTokens.set(token.name, token); + } else if (relativePath.includes('Light.tokens')) { + lightTokens.set(token.name, token); + } else if (relativePath.includes('Dark.tokens')) { + darkTokens.set(token.name, token); + } else { + originPrimitives.set(token.name, token); + } + } + } + + let scss = `// Auto-generated — do not edit. Run: yarn tokens:build + +:root { +`; + + function writeTokenGroup(tokens) { + if (tokens.size === 0) return ''; + + let output = ''; + for (const [name, token] of tokens) { + const varName = toVarName(token.name); + const value = toCSSValue(token); + output += ` ${varName}: ${value};\n`; + } + return output; + } + + scss += writeTokenGroup(baselineTokens); + scss += writeTokenGroup(originPrimitives); + scss += writeTokenGroup(lightTokens); + + scss += `} + +[data-theme="dark"], +.dark { +`; + + for (const [name, token] of darkTokens) { + scss += ` ${toVarName(name)}: ${toCSSValue(token)};\n`; + } + + scss += `} + +@media (prefers-color-scheme: dark) { + :root:not([data-theme="light"]) { +`; + + for (const [name, token] of darkTokens) { + scss += ` ${toVarName(name)}: ${toCSSValue(token)};\n`; + } + + scss += ` } +} +`; + + fs.mkdirSync(path.dirname(OUTPUT_FILE), { recursive: true }); + fs.writeFileSync(OUTPUT_FILE, scss); + + const totalTokens = baselineTokens.size + originPrimitives.size + lightTokens.size + darkTokens.size; + console.log(`\nGenerated ${OUTPUT_FILE}`); + console.log(` ${totalTokens} total tokens`); + console.log(` - Baseline: ${baselineTokens.size}`); + console.log(` - Primitives: ${originPrimitives.size}`); + console.log(` - Light mode: ${lightTokens.size}`); + console.log(` - Dark mode: ${darkTokens.size}`); +} + +build(); diff --git a/packages/origin/scripts/check-baseui-version.js b/packages/origin/scripts/check-baseui-version.js new file mode 100644 index 000000000..1fb26919a --- /dev/null +++ b/packages/origin/scripts/check-baseui-version.js @@ -0,0 +1,61 @@ +#!/usr/bin/env node + +/** + * Checks if the Base UI version has changed since we last synced our utilities. + * + * Usage: yarn check:baseui + */ + +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const UTILS_FILE = path.join(__dirname, '../src/lib/base-ui-utils.ts'); +const BASE_UI_PKG = path.join(__dirname, '../node_modules/@base-ui-components/react/package.json'); + +// Files we copied from Base UI +const COPIED_FILES = [ + 'esm/utils/getStateAttributesProps.js', + 'esm/utils/createBaseUIEventDetails.js', + 'esm/utils/reason-parts.js', +]; + +function getInstalledVersion() { + const pkg = JSON.parse(fs.readFileSync(BASE_UI_PKG, 'utf-8')); + return pkg.version; +} + +function getSyncedVersion() { + const content = fs.readFileSync(UTILS_FILE, 'utf-8'); + const match = content.match(/@baseui-version\s+([\d.a-z-]+)/); + return match ? match[1] : null; +} + +function main() { + const installed = getInstalledVersion(); + const synced = getSyncedVersion(); + + console.log('Base UI Version Check'); + console.log('====================='); + console.log(`Installed: ${installed}`); + console.log(`Synced: ${synced || 'unknown'}`); + console.log(''); + + if (installed !== synced) { + console.log('WARNING: Version mismatch!'); + console.log(''); + console.log('Review these files for changes:'); + COPIED_FILES.forEach(file => { + console.log(` node_modules/@base-ui-components/react/${file}`); + }); + console.log(''); + console.log('After syncing, update @baseui-version in src/lib/base-ui-utils.ts'); + process.exit(1); + } else { + console.log('OK: Versions match'); + } +} + +main(); diff --git a/packages/origin/scripts/extract-icons.mjs b/packages/origin/scripts/extract-icons.mjs new file mode 100644 index 000000000..8011a6b02 --- /dev/null +++ b/packages/origin/scripts/extract-icons.mjs @@ -0,0 +1,505 @@ +/** + * Extract and vendor Central Icons. + * + * This script is the single source of truth for which icons Origin uses. + * It copies icon files from @central-icons-react packages (devDependencies) + * into src/components/Icon/icons/ and generates icon-registry.ts. + * + * Usage: + * yarn icons:extract (requires @central-icons-react packages installed) + * + * To add a new icon: + * 1. Add an entry to SECTIONS below + * 2. Run: yarn icons:extract + * 3. Commit the updated icons/ directory and icon-registry.ts + */ + +import { existsSync, mkdirSync, cpSync, rmSync, writeFileSync, readFileSync } from 'node:fs'; +import { join, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const ROOT = join(__dirname, '..'); +const ICONS_DIR = join(ROOT, 'src', 'components', 'Icon', 'icons'); +const REGISTRY_PATH = join(ROOT, 'src', 'components', 'Icon', 'icon-registry.ts'); + +// ── Package mapping ────────────────────────────────────────── + +const PACKAGES = { + outlined: '@central-icons-react/round-outlined-radius-3-stroke-1.5', + sharp: '@central-icons-react/round-outlined-radius-0-stroke-1.5', + filled: '@central-icons-react/round-filled-radius-3-stroke-1.5', +}; + +// ── Icon configuration ─────────────────────────────────────── +// +// Each section: { section, icons } +// - section: Comment label used in the generated registry +// - icons: Array of { name, variant?, exportAs? } +// +// Icon fields: +// - name: Component name in Central Icons +// - variant: 'outlined' (default) | 'sharp' | 'filled' +// - exportAs: Name exported from Origin (defaults to name) + +const SECTIONS = [ + { + section: 'Arrows & Navigation', + icons: [ + { name: 'IconArrow', variant: 'sharp' }, + { name: 'IconArrowDown', variant: 'sharp' }, + { name: 'IconArrowDownLeft', variant: 'sharp' }, + { name: 'IconArrowDownRight', variant: 'sharp' }, + { name: 'IconArrowLeft', variant: 'sharp' }, + { name: 'IconArrowRight', variant: 'sharp' }, + { name: 'IconArrowUp', variant: 'sharp' }, + { name: 'IconArrowUpLeft', variant: 'sharp' }, + { name: 'IconArrowUpRight', variant: 'sharp' }, + { name: 'IconRedirectArrow', variant: 'sharp' }, + { name: 'IconArrowBoxRight' }, + { name: 'IconArrowDownSquare' }, + { name: 'IconArrowDownWall' }, + { name: 'IconArrowInbox' }, + { name: 'IconArrowLeftSquare' }, + { name: 'IconArrowLoopDownLeft' }, + { name: 'IconArrowOutOfBox' }, + { name: 'IconArrowRightSquare' }, + { name: 'IconArrowUpSquare' }, + { name: 'IconArrowUpWall' }, + { name: 'IconArrowsRepeat' }, + { name: 'IconArrowsRepeatCircle' }, + { name: 'IconRotate360Left' }, + { name: 'IconRotate360Right' }, + ], + }, + { + section: 'Chevrons', + icons: [ + { name: 'IconChevronBottom', variant: 'sharp' }, + { name: 'IconChevronDownSmall', variant: 'sharp' }, + { name: 'IconChevronGrabberVertical', variant: 'sharp' }, + { name: 'IconChevronLeft', variant: 'sharp' }, + { name: 'IconChevronLeftSmall', variant: 'sharp' }, + { name: 'IconChevronRight', variant: 'sharp' }, + { name: 'IconChevronRightSmall', variant: 'sharp' }, + { name: 'IconChevronTop', variant: 'sharp' }, + { name: 'IconChevronTopSmall', variant: 'sharp' }, + ], + }, + { + section: 'Actions & UI', + icons: [ + { name: 'IconAdjustPhoto' }, + { name: 'IconAt' }, + { name: 'IconAutoCrop' }, + { name: 'IconBarsThree2' }, + { name: 'IconBell' }, + { name: 'IconBellOff' }, + { name: 'IconBlackpoint' }, + { name: 'IconBank' }, + { name: 'IconBuildings' }, + { name: 'IconBrackets1' }, + { name: 'IconBrokenHeart' }, + { name: 'IconBrowserTabs' }, + { name: 'IconBubble3' }, + { name: 'IconBubbleWideSparkle' }, + { name: 'IconCalendarDays' }, + { name: 'IconCheckmark2' }, + { name: 'IconCheckmark2Small' }, + { name: 'IconCircleCheck' }, + { name: 'IconCircleCheck', variant: 'filled', exportAs: 'IconCircleCheckFilled' }, + { name: 'IconCircleInfo' }, + { name: 'IconCircleInfo', variant: 'filled', exportAs: 'IconCircleInfoFilled' }, + { name: 'IconCirclePlus' }, + { name: 'IconCircleQuestionmark' }, + { name: 'IconCircleX', variant: 'filled' }, + { name: 'IconClipboard2' }, + { name: 'IconClipboard2Sparkle' }, + { name: 'IconCoinsAdd' }, + { name: 'IconCoinsAdd', variant: 'filled', exportAs: 'IconCoinsAddFilled' }, + { name: 'IconClock' }, + { name: 'IconCmdBox' }, + { name: 'IconConnectors1' }, + { name: 'IconConnectors2' }, + { name: 'IconConsoleSparkle' }, + { name: 'IconCrossLarge' }, + { name: 'IconCrossMedium' }, + { name: 'IconCrossSmall' }, + { name: 'IconCryptoWallet' }, + { name: 'IconDevices', variant: 'filled' }, + { name: 'IconDiamondShine' }, + { name: 'IconDifferenceIgnored' }, + { name: 'IconDifferenceModified' }, + { name: 'IconDiscoBall' }, + { name: 'IconDotGrid1x3Horizontal' }, + { name: 'IconDotGrid1x3HorizontalTight' }, + { name: 'IconDotGrid1x3Vertical' }, + { name: 'IconDotGrid1x3VerticalTight' }, + { name: 'IconDotGrid2x3' }, + { name: 'IconDotGrid3x3' }, + { name: 'IconExclamationTriangle' }, + { name: 'IconExclamationTriangle', variant: 'filled', exportAs: 'IconExclamationTriangleFilled' }, + { name: 'IconEyeOpen' }, + { name: 'IconEyeSlash' }, + { name: 'IconEyeSlash2' }, + { name: 'IconFileArrowLeftIn' }, + { name: 'IconFileArrowLeftOut' }, + { name: 'IconFileArrowRightOut' }, + { name: 'IconFileBend' }, + { name: 'IconFilter2' }, + { name: 'IconFolderAddRight' }, + { name: 'IconFingerPrint1' }, + { name: 'IconFormPyramide' }, + { name: 'IconForYou' }, + { name: 'IconFullScreen' }, + { name: 'IconGlobe2' }, + { name: 'IconHeart2' }, + { name: 'IconHeart2', variant: 'filled', exportAs: 'IconHeart2Filled' }, + { name: 'IconHome' }, + { name: 'IconImport2' }, + { name: 'IconInitiatives' }, + { name: 'IconInvite' }, + { name: 'IconKey2' }, + { name: 'IconLayoutColumn' }, + { name: 'IconLayoutLeft' }, + { name: 'IconLayoutRight' }, + { name: 'IconListSparkle' }, + { name: 'IconLiveActivity' }, + { name: 'IconLiveFull' }, + { name: 'IconLoader' }, + { name: 'IconLock' }, + { name: 'IconMagnifyingGlass2' }, + { name: 'IconMinusLarge' }, + { name: 'IconMinusSmall' }, + { name: 'IconMoon', variant: 'filled' }, + { name: 'IconMouse' }, + { name: 'IconOffline' }, + { name: 'IconOngoing' }, + { name: 'IconOngoing', variant: 'filled', exportAs: 'IconOngoingFilled' }, + { name: 'IconPaperclip1' }, + { name: 'IconPaperPlaneTopRight' }, + { name: 'IconPaperPlaneTopRight', variant: 'filled', exportAs: 'IconPaperPlaneTopRightFilled' }, + { name: 'IconPassport' }, + { name: 'IconPassword' }, + { name: 'IconPasswordStars' }, + { name: 'IconPencil' }, + { name: 'IconPencil2' }, + { name: 'IconPencil3' }, + { name: 'IconPencilAi' }, + { name: 'IconPeople2' }, + { name: 'IconPeople2', variant: 'filled', exportAs: 'IconPeople2Filled' }, + { name: 'IconPeopleAdd' }, + { name: 'IconPeopleAdd', variant: 'filled', exportAs: 'IconPeopleAddFilled' }, + { name: 'IconPeopleCircle' }, + { name: 'IconPeopleIdCard' }, + { name: 'IconPhone' }, + { name: 'IconPhoneDynamicIsland' }, + { name: 'IconPlusLarge' }, + { name: 'IconPlusSmall' }, + { name: 'IconPrompt' }, + { name: 'IconRandom' }, + { name: 'IconRemix' }, + { name: 'IconRemoveKeyframe' }, + { name: 'IconRepeat' }, + { name: 'IconRescueRing' }, + { name: 'IconRunShortcut' }, + { name: 'IconScanCode' }, + { name: 'IconSearchIntelligence' }, + { name: 'IconSearchlinesSparkle' }, + { name: 'IconSecretPhrase' }, + { name: 'IconSettingsGear1' }, + { name: 'IconSettingsGear2' }, + { name: 'IconShield' }, + { name: 'IconShield2' }, + { name: 'IconShieldKeyhole' }, + { name: 'IconSidebarSimpleLeftWide' }, + { name: 'IconSpacebar' }, + { name: 'IconSquareBehindSquare1' }, + { name: 'IconSquareBehindSquare6' }, + { name: 'IconSquareInfo' }, + { name: 'IconSquareArrowTopRight2' }, + { name: 'IconSquarePlus' }, + { name: 'IconSticker' }, + { name: 'IconSun', variant: 'filled' }, + { name: 'IconStop' }, + { name: 'IconStopCircle' }, + { name: 'IconTag' }, + { name: 'IconTarget' }, + { name: 'IconTelescope' }, + { name: 'IconTextToSpeach' }, + { name: 'IconThumbDownCurved' }, + { name: 'IconThumbUpCurved' }, + { name: 'IconTextareaDrag' }, + { name: 'IconTimeFlies' }, + { name: 'IconTimeslot' }, + { name: 'IconToggle' }, + { name: 'IconTrashCanSimple' }, + { name: 'IconTrashRounded' }, + { name: 'IconUnblur' }, + { name: 'IconUsbC' }, + { name: 'IconVariables' }, + { name: 'IconWallet1' }, + { name: 'IconWallet3' }, + { name: 'IconWeb3' }, + { name: 'IconWindowSparkle' }, + { name: 'IconWreathSimple' }, + ], + }, + { + section: 'AI & Sparkle', + icons: [ + { name: 'IconAgenticCoding' }, + { name: 'IconImagineAi' }, + { name: 'IconVibeCoding2' }, + { name: 'IconVisualIntelligence' }, + ], + }, + { + section: 'Voice', + icons: [ + { name: 'IconVoiceHigh' }, + { name: 'IconVoiceLow' }, + { name: 'IconVoiceMid' }, + { name: 'IconVoiceRecord' }, + { name: 'IconVoiceSettings' }, + { name: 'IconVoiceSparkle' }, + ], + }, + { + section: 'User & People', + icons: [ + { name: 'IconPeople' }, + { name: 'IconUserAdded' }, + { name: 'IconUserAddRight' }, + { name: 'IconUserBlock' }, + { name: 'IconUserDuo' }, + { name: 'IconUserEdit' }, + { name: 'IconUserGroup' }, + { name: 'IconUserRemove' }, + { name: 'IconUserRemoveRight' }, + { name: 'IconUserSettings' }, + ], + }, + { + section: 'Brands & Logos', + icons: [ + { name: 'IconAntigravity' }, + { name: 'IconApple' }, + { name: 'IconBitcoinLogo' }, + { name: 'IconClaudeai' }, + { name: 'IconCursor' }, + { name: 'IconEuropeanUnion' }, + { name: 'IconGemini' }, + { name: 'IconGithub' }, + { name: 'IconGrok' }, + { name: 'IconIsoOrg' }, + { name: 'IconLinear' }, + { name: 'IconLinkedin' }, + { name: 'IconNotion' }, + { name: 'IconOpenai' }, + { name: 'IconSlack' }, + { name: 'IconSupabase' }, + { name: 'IconTwitter' }, + { name: 'IconV0' }, + { name: 'IconVercel' }, + ], + }, +]; + +// Convenience aliases — reference existing icons, not extracted separately +const ALIASES = [ + { alias: 'IconChevronDown', target: 'IconChevronDownSmall', section: 'Chevrons' }, +]; + +// ── Helpers ────────────────────────────────────────────────── + +function resolvePackagePath(variant) { + const pkg = PACKAGES[variant]; + if (!pkg) throw new Error(`Unknown variant: ${variant}`); + const pkgPath = join(ROOT, 'node_modules', pkg); + if (!existsSync(pkgPath)) { + throw new Error( + `Package ${pkg} not found. Run yarn install with CENTRAL_LICENSE_KEY set.` + ); + } + return pkgPath; +} + +function copyIconFiles(srcDir, destDir) { + if (!existsSync(srcDir)) return false; + mkdirSync(destDir, { recursive: true }); + for (const file of ['index.mjs', 'index.d.ts']) { + const src = join(srcDir, file); + if (!existsSync(src)) continue; + if (file === 'index.mjs') { + const content = readFileSync(src, 'utf-8').replace( + /\n\/\/#\s*sourceMappingURL=.*$/m, + '' + ); + writeFileSync(join(destDir, file), content); + } else { + cpSync(src, join(destDir, file)); + } + } + return true; +} + +// ── Extract icons from node_modules ────────────────────────── + +function extractIcons() { + console.log('Extracting icons from @central-icons-react...\n'); + + const packagePaths = {}; + for (const [variant, pkg] of Object.entries(PACKAGES)) { + packagePaths[variant] = resolvePackagePath(variant); + console.log(` ${variant}: ${packagePaths[variant]}`); + } + + if (existsSync(ICONS_DIR)) rmSync(ICONS_DIR, { recursive: true }); + mkdirSync(ICONS_DIR, { recursive: true }); + + // CentralIconBase is needed for .d.ts type resolution + const baseSrc = join(packagePaths.outlined, 'CentralIconBase'); + if (copyIconFiles(baseSrc, join(ICONS_DIR, 'CentralIconBase'))) { + console.log('\n Copied CentralIconBase'); + } + + let extracted = 0; + let warnings = 0; + + for (const { icons } of SECTIONS) { + for (const icon of icons) { + const variant = icon.variant || 'outlined'; + const exportAs = icon.exportAs || icon.name; + const srcDir = join(packagePaths[variant], icon.name); + const destDir = join(ICONS_DIR, exportAs); + + if (copyIconFiles(srcDir, destDir)) { + extracted++; + } else { + console.warn(` WARN: ${icon.name} not found in ${PACKAGES[variant]}`); + warnings++; + } + } + } + + console.log(`\n Extracted ${extracted} icons`); + if (warnings > 0) console.warn(` ${warnings} warning(s)`); + return warnings === 0; +} + +// ── Generate icon-registry.ts ──────────────────────────────── + +function generateRegistry() { + const lines = [ + '/**', + ' * Auto-generated by scripts/extract-icons.mjs — do not edit.', + ' *', + ' * To add or update icons, edit the SECTIONS config in that script', + ' * and run: yarn icons:extract', + ' */', + '', + ]; + + // Imports — sorted alphabetically by exportAs within each section + for (const { section, icons } of SECTIONS) { + lines.push(`// ${section}`); + + const sorted = icons + .map((icon) => ({ + name: icon.name, + exportAs: icon.exportAs || icon.name, + })) + .sort((a, b) => a.exportAs.localeCompare(b.exportAs)); + + for (const { name, exportAs } of sorted) { + if (name === exportAs) { + lines.push(`import { ${name} } from './icons/${exportAs}';`); + } else { + lines.push( + `import { ${name} as ${exportAs} } from './icons/${exportAs}';` + ); + } + } + + lines.push(''); + } + + // Aliases + if (ALIASES.length > 0) { + for (const { alias, target } of ALIASES) { + lines.push(`const ${alias} = ${target};`); + } + lines.push(''); + } + + // ICON_REGISTRY + lines.push('export const ICON_REGISTRY = {'); + + for (const { section, icons } of SECTIONS) { + const exportNames = icons + .map((icon) => icon.exportAs || icon.name) + .concat( + ALIASES.filter((a) => a.section === section).map((a) => a.alias) + ) + .sort(); + + lines.push(` // ${section}`); + for (const name of exportNames) { + lines.push(` ${name},`); + } + lines.push(''); + } + + // Remove trailing blank line inside the object + if (lines[lines.length - 1] === '') lines.pop(); + + lines.push('} as const;'); + lines.push(''); + lines.push('export type CentralIconName = keyof typeof ICON_REGISTRY;'); + lines.push(''); + + writeFileSync(REGISTRY_PATH, lines.join('\n')); + console.log(`\n Generated ${REGISTRY_PATH}`); +} + +// ── Validate extracted icons ───────────────────────────────── + +function validateIcons() { + let errors = 0; + + for (const { icons } of SECTIONS) { + for (const icon of icons) { + const exportAs = icon.exportAs || icon.name; + const dir = join(ICONS_DIR, exportAs); + + for (const file of ['index.mjs', 'index.d.ts']) { + if (!existsSync(join(dir, file))) { + console.error(` MISSING: ${exportAs}/${file}`); + errors++; + } + } + } + } + + if (errors > 0) { + console.error(`\n Validation failed: ${errors} missing file(s)`); + } else { + console.log(' Validation passed'); + } + + return errors === 0; +} + +// ── Main ───────────────────────────────────────────────────── + +function main() { + const ok = extractIcons(); + generateRegistry(); + console.log(''); + const valid = validateIcons(); + console.log('\nDone.'); + if (!ok || !valid) process.exit(1); +} + +main(); diff --git a/packages/origin/scripts/patch-playwright-ct.js b/packages/origin/scripts/patch-playwright-ct.js new file mode 100644 index 000000000..915158cb1 --- /dev/null +++ b/packages/origin/scripts/patch-playwright-ct.js @@ -0,0 +1,93 @@ +/** + * Patches Playwright to support SCSS/Sass/Less imports in component tests. + * + * Problem: Playwright's ESM loader runs Babel on ALL non-node_modules files, + * including .scss/.sass/.less. Babel can't parse CSS preprocessor syntax, + * causing "Support for the experimental syntax 'decorators'" errors. + * + * Root cause chain: + * 1. esmLoader.js load() accepts format=null (unknown file types) + * 2. shouldTransform() returns true for any file outside node_modules + * 3. transformHook() runs Babel on the .scss file + * 4. Babel interprets @use as a decorator → SyntaxError + * + * Fix (two patches): + * A. esmLoader.js: Return empty module for CSS preprocessor files before + * they reach Babel. Tests don't need actual CSS — just a valid export. + * B. tsxTransform.js: Add .scss/.sass/.less to artifactExtensions so the + * Babel plugin strips these imports from test files during collection. + * + * This runs as a postinstall script. Safe to re-run (idempotent). + */ + +import { readFileSync, writeFileSync, existsSync } from 'fs'; +import { dirname, join } from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const projectRoot = join(__dirname, '..'); +const nodeModules = join(projectRoot, 'node_modules'); + +const PREPROCESSOR_EXTENSIONS = ['.scss', '.sass', '.less']; +const SENTINEL = '/* patched-by-origin: css-preprocessor-support */'; + +// --------------------------------------------------------------------------- +// Patch A: esmLoader.js — skip CSS preprocessor files +// --------------------------------------------------------------------------- +function patchEsmLoader() { + const loaderPath = join(nodeModules, 'playwright', 'lib', 'transform', 'esmLoader.js'); + if (!existsSync(loaderPath)) return; + + let source = readFileSync(loaderPath, 'utf8'); + if (source.includes(SENTINEL)) return; // already patched + + // Insert a guard at the top of the load() function that returns an empty + // module for CSS preprocessor files. The guard goes right after the + // "async function load(moduleUrl, context, defaultLoad) {" line. + const target = 'async function load(moduleUrl, context, defaultLoad) {'; + if (!source.includes(target)) { + console.warn('patch-playwright-ct: could not find load() in esmLoader.js — skipping'); + return; + } + + const guard = `${target} + ${SENTINEL} + const _ext = moduleUrl.slice(moduleUrl.lastIndexOf('.')); + if ([${PREPROCESSOR_EXTENSIONS.map(e => `'${e}'`).join(', ')}].includes(_ext)) { + return { format: 'module', source: 'export default {};', shortCircuit: true }; + }`; + + source = source.replace(target, guard); + writeFileSync(loaderPath, source, 'utf8'); + console.log('Patched playwright esmLoader.js: CSS preprocessor files return empty module'); +} + +// --------------------------------------------------------------------------- +// Patch B: tsxTransform.js — add preprocessor extensions to artifact set +// --------------------------------------------------------------------------- +function patchTsxTransform() { + const transformPath = join( + nodeModules, '@playwright', 'experimental-ct-core', 'lib', 'tsxTransform.js' + ); + if (!existsSync(transformPath)) return; + + let source = readFileSync(transformPath, 'utf8'); + if (source.includes('.scss')) return; // already patched + + const target = '// CSS\n ".css"'; + if (!source.includes(target)) { + console.warn('patch-playwright-ct: could not find CSS entry in tsxTransform.js — skipping'); + return; + } + + const replacement = '// CSS\n ".css",\n ".scss",\n ".sass",\n ".less"'; + source = source.replace(target, replacement); + writeFileSync(transformPath, source, 'utf8'); + console.log('Patched playwright tsxTransform.js: added .scss/.sass/.less to artifactExtensions'); +} + +// --------------------------------------------------------------------------- +// Run both patches +// --------------------------------------------------------------------------- +patchEsmLoader(); +patchTsxTransform(); diff --git a/packages/origin/skills/origin/SKILL.md b/packages/origin/skills/origin/SKILL.md new file mode 100644 index 000000000..1f77eb928 --- /dev/null +++ b/packages/origin/skills/origin/SKILL.md @@ -0,0 +1,198 @@ +--- +name: origin +description: Use when building UI with @lightsparkdev/origin design system components. Covers setup, component APIs, icons, tokens, and patterns. +--- + +# Origin Design System + +Origin is a Figma-first React component library built on Base UI. It ships as raw TypeScript + SCSS source and requires a Next.js consumer with `transpilePackages`. + +## Required Setup + +### next.config.ts + +```ts +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + transpilePackages: ['@lightsparkdev/origin'], +}; + +export default nextConfig; +``` + +### Global styles (layout.tsx or app entry) + +```ts +import "@lightsparkdev/origin/styles.css"; +``` + +### Advanced SCSS token imports (optional) + +If you need Origin mixins in your own SCSS files, enable Sass package imports: + +```ts +import type { NextConfig } from "next"; +import * as sass from "sass"; + +const nextConfig: NextConfig = { + transpilePackages: ['@lightsparkdev/origin'], + sassOptions: { + importers: [new sass.NodePackageImporter()], + }, +}; + +export default nextConfig; +``` + +### Webpack alias caveat + +If adding a `resolve.alias` for `@lightsparkdev/origin`, always use the exact-match `$` suffix: + +```js +config.resolve.alias['@lightsparkdev/origin$'] = '/path/to/src/index.ts'; +``` + +Without `$`, the alias hijacks subpath imports and breaks `@lightsparkdev/origin/styles.css`. + +### Fonts + +Copy fonts from the package into your app's public directory: + +```bash +cp -r node_modules/@lightsparkdev/origin/public/fonts/ public/fonts/ +``` + +The `@font-face` declarations expect fonts served at `/fonts/`. Includes Suisse Intl (Regular 400, Book 450, Medium 500) and Suisse Int'l Mono. + +### Dependencies + +``` +npm install @lightsparkdev/origin sass +``` + +`sass` is required (not optional) — every component imports SCSS modules. + +## Imports + +All components are exported from the package root: + +```tsx +import { Button, Dialog, CentralIcon, Tabs } from '@lightsparkdev/origin'; +``` + +## Component Patterns + +### Compound components (namespace pattern) + +These use dot notation for sub-components: + +```tsx + + Open + + + + Title + Body text + Close + + + +``` + +Compound components: Accordion, AlertDialog, Autocomplete, Breadcrumb, Card, Checkbox, Combobox, Command, ContextMenu, Dialog, Field, Fieldset, InputGroup, Menu, Menubar, Meter, NavigationMenu, Pagination, PhoneInput, Popover, Progress, Radio, Select, Sidebar, Table, Tabs, TextareaGroup, Toast, Tooltip. + +### Simple components (direct props) + +```tsx + +``` + +Simple components: ActionBar, Alert, Avatar, Badge, Button, ButtonGroup, Chip, ChipFilter, Form, Input, Item, Loader, Logo, Separator, Shortcut, Switch, Textarea, Toggle, ToggleGroup, VisuallyHidden. + +### Chart (namespace export) + +```tsx +import { Chart } from '@lightsparkdev/origin'; + + + + + + + + + + +``` + +## Button API + +```tsx +interface ButtonProps { + variant?: 'filled' | 'secondary' | 'outline' | 'ghost' | 'critical' | 'link'; + size?: 'default' | 'compact' | 'dense'; + loading?: boolean; + loadingIndicator?: ReactNode; + leadingIcon?: ReactNode; + trailingIcon?: ReactNode; + iconOnly?: boolean; +} +``` + +## Icons + +Use `CentralIcon` with a `name` prop. All icon names are typed via `CentralIconName`. + +```tsx +import { CentralIcon } from '@lightsparkdev/origin'; + + + +``` + +Props: `name` (required), `size` (default 24), `color` (default "currentColor"), `className`, `style`. + +Strokes scale proportionally with size (1.5px stroke at 24px becomes ~1px at 16px). + +Common icon names by category: + +- Arrows: IconArrow, IconArrowRight, IconArrowLeft, IconArrowUp, IconArrowDown, IconArrowBoxRight, IconArrowOutOfBox, IconRedirectArrow +- Chevrons: IconChevronRight, IconChevronLeft, IconChevronBottom, IconChevronTop, IconChevronDownSmall, IconChevronRightSmall +- Actions: IconPlusSmall, IconPlusLarge, IconMinusSmall, IconCrossSmall, IconCrossLarge, IconCheckmark2, IconPencil, IconTrashCanSimple, IconMagnifyingGlass2, IconFilter2 +- Status: IconCircleCheck, IconCircleCheckFilled, IconCircleInfo, IconCircleInfoFilled, IconExclamationTriangle, IconExclamationTriangleFilled, IconCircleX +- UI: IconSettingsGear1, IconBell, IconEyeOpen, IconEyeSlash, IconLock, IconHome, IconGlobe2, IconLoader +- People: IconPeople2, IconUserDuo, IconUserGroup, IconUserAdded, IconPeopleCircle +- Brands: IconGithub, IconSlack, IconLinear, IconNotion, IconApple, IconClaudeai + +## Design Tokens + +Tokens are CSS custom properties defined in `_variables.scss`. Use them via `var()`: + +- Spacing: `--spacing-xs` (8px), `--spacing-sm` (12px), `--spacing-md` (16px), `--spacing-lg` (20px), `--spacing-xl` (24px), `--spacing-2xl` (32px) +- Corner radius: `--corner-radius-xs`, `--corner-radius-sm` (6px), `--corner-radius-md`, `--corner-radius-lg`, `--corner-radius-full` +- Colors: `--surface-primary`, `--surface-secondary`, `--surface-hover`, `--text-primary`, `--text-secondary`, `--text-tertiary`, `--border-primary`, `--border-secondary`, `--border-critical` +- Typography: `--font-size-base` (14px), `--font-family-sans`, `--font-weight-book`, `--font-weight-medium`, `--font-weight-bold` + +## SCSS Mixins + +Available via `@use 'pkg:@lightsparkdev/origin/tokens/mixins' as *;`: + +- `@include smooth-corners($radius)` — border-radius with future squircle support +- `@include surface-with-hover($base)` — background with hover overlay +- `@include input-focus` — standard input focus state (border + shadow) +- `@include input-critical` — error state (red border + pink shadow) +- `@include button-reset` — strip default button styles +- `@include visually-hidden` — accessible screen-reader-only content +- `@include text-label` — standard label text style + +## Key Conventions + +- All components use `'use client'` — they are client components +- Components are built on `@base-ui/react` primitives +- Styles use CSS Modules (`.module.scss` files) with SCSS +- Components accept standard HTML attributes via prop spreading +- Compound components use React context internally — sub-components must be nested under their Root diff --git a/packages/origin/src/app/globals.scss b/packages/origin/src/app/globals.scss new file mode 100644 index 000000000..4ba2f2ac0 --- /dev/null +++ b/packages/origin/src/app/globals.scss @@ -0,0 +1 @@ +@use "../styles/public"; diff --git a/packages/origin/src/app/layout.tsx b/packages/origin/src/app/layout.tsx new file mode 100644 index 000000000..3dac973cb --- /dev/null +++ b/packages/origin/src/app/layout.tsx @@ -0,0 +1,20 @@ +import type { Metadata } from "next"; +import "@/tokens/_variables.scss"; +import "./globals.scss"; + +export const metadata: Metadata = { + title: "Origin Design System v2", + description: "Base UI + Figma-first component library", +}; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + {children} + + ); +} diff --git a/packages/origin/src/app/page.tsx b/packages/origin/src/app/page.tsx new file mode 100644 index 000000000..35d11a887 --- /dev/null +++ b/packages/origin/src/app/page.tsx @@ -0,0 +1,7170 @@ +"use client"; + +import * as React from "react"; +import { matchSorter } from "match-sorter"; +import { Accordion } from "@/components/Accordion"; +import { Collapsible } from "@/components/Collapsible"; +import { + ActionBar, + ActionBarLabel, + ActionBarActions, +} from "@/components/ActionBar"; +import { Autocomplete } from "@/components/Autocomplete"; +import { Alert } from "@/components/Alert"; +import { AlertDialog } from "@/components/AlertDialog"; +import { Dialog } from "@/components/Dialog"; +import { Drawer } from "@/components/Drawer"; +import { Badge } from "@/components/Badge"; +import { Breadcrumb } from "@/components/Breadcrumb"; +import { Button } from "@/components/Button"; +import { ButtonGroup } from "@/components/ButtonGroup"; +import { InputGroup } from "@/components/InputGroup"; +import { Card } from "@/components/Card"; +import { Checkbox } from "@/components/Checkbox"; +import { Chip, ChipFilter } from "@/components/Chip"; +import { Combobox } from "@/components/Combobox"; +import { Field } from "@/components/Field"; +import { Fieldset } from "@/components/Fieldset"; +import { Form } from "@/components/Form"; +import { CentralIcon } from "@/components/Icon"; +import { Input } from "@/components/Input"; +import { Item } from "@/components/Item"; +import { Loader } from "@/components/Loader"; +import { Command } from "@/components/Command"; +import { Menu } from "@/components/Menu"; +import { Menubar } from "@/components/Menubar"; +import { NavigationMenu } from "@/components/NavigationMenu"; +import { ContextMenu } from "@/components/ContextMenu"; +import { Meter } from "@/components/Meter"; +import { Pagination } from "@/components/Pagination"; +import { PhoneInput } from "@/components/PhoneInput"; +import { Progress } from "@/components/Progress"; +import { Radio } from "@/components/Radio"; +import { Select } from "@/components/Select"; +import { SegmentedNav } from "@/components/SegmentedNav"; +import { Separator } from "@/components/Separator"; +import { Sidebar } from "@/components/Sidebar"; +import { Skeleton } from "@/components/Skeleton"; +import { Shortcut } from "@/components/Shortcut"; +import { Switch } from "@/components/Switch"; +import { Textarea } from "@/components/Textarea"; +import { TextareaGroup } from "@/components/TextareaGroup"; +import { Tabs } from "@/components/Tabs"; +import { Table } from "@/components/Table"; +import * as Chart from "@/components/Chart"; +import { + useReactTable, + getCoreRowModel, + getSortedRowModel, + flexRender, + createColumnHelper, + SortingState, + RowSelectionState, +} from "@tanstack/react-table"; +import { Toast, ToastVariant } from "@/components/Toast"; +import { Tooltip } from "@/components/Tooltip"; +import { Popover } from "@/components/Popover"; +import { PreviewCard } from "@/components/PreviewCard"; +import { Logo } from "@/components/Logo"; +import { Toggle, ToggleGroup } from "@/components/Toggle"; +import * as DatePicker from "@/components/DatePicker"; +import type { DateRange } from "@/components/DatePicker"; +// Data for combobox examples +const fruits = [ + "Apple", + "Banana", + "Cherry", + "Date", + "Elderberry", + "Fig", + "Grape", +]; + +// Toast demo components +function ToastDemo() { + const toastManager = Toast.useToastManager(); + + const showToast = ( + variant: ToastVariant, + title: string, + description?: string, + actionLabel?: string, + ) => { + toastManager.add({ + title, + description, + data: { variant, actionLabel }, + }); + }; + + return ( +

+ ); +} + +function ToastRenderer() { + const toastManager = Toast.useToastManager(); + + return ( + <> + {toastManager.toasts.map((toast) => { + const variant = (toast.data?.variant as ToastVariant) || "default"; + const actionLabel = toast.data?.actionLabel as string | undefined; + return ( + + {variant !== "default" && } + + {toast.title} + {toast.description && ( + {toast.description} + )} + + {actionLabel && {actionLabel}} + + + ); + })} + + ); +} + +// Data for autocomplete examples +const autocompleteFruits = [ + { value: "apple", label: "Apple" }, + { value: "banana", label: "Banana" }, + { value: "cherry", label: "Cherry" }, + { value: "date", label: "Date" }, + { value: "elderberry", label: "Elderberry" }, + { value: "fig", label: "Fig" }, + { value: "grape", label: "Grape" }, +]; + +interface AutocompleteFruit { + value: string; + label: string; +} + +interface FuzzyItem { + label: string; +} + +const fuzzyItems: FuzzyItem[] = [ + { label: "React" }, + { label: "JavaScript" }, + { label: "TypeScript" }, + { label: "Node.js" }, + { label: "CSS Grid" }, + { label: "Flexbox" }, + { label: "Redux" }, + { label: "GraphQL" }, +]; + +function fuzzyFilter(item: FuzzyItem, query: string): boolean { + if (!query) return true; + const results = matchSorter([item], query, { + keys: ["label"], + }); + return results.length > 0; +} + +function highlightMatch(text: string, query: string): React.ReactNode { + if (!query.trim()) { + return text; + } + + const escaped = query.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const regex = new RegExp(`(${escaped})`, "gi"); + const parts = text.split(regex); + const lowerQuery = query.toLowerCase(); + + return ( + + {parts.map((part, i) => + part.toLowerCase() === lowerQuery ? ( + + {part} + + ) : ( + + {part} + + ), + )} + + ); +} + +function FuzzyMatchingDemo() { + const [value, setValue] = React.useState(""); + + return ( +
+ + Fuzzy Matching (try "rct") + + item.label} + value={value} + onValueChange={setValue} + > + + + + + No results found. + + {(item: FuzzyItem) => ( + + {highlightMatch(item.label, value)} + + )} + + + + + +
+ ); +} + +function CommandDemo() { + const [basicOpen, setBasicOpen] = React.useState(false); + const [fullOpen, setFullOpen] = React.useState(false); + + // Basic items (flat) + const basicItems: import("@/components/Command").CommandItem[] = [ + { + id: "1", + label: "Calendar", + icon: , + }, + { + id: "2", + label: "Search Emoji", + icon: , + }, + { + id: "3", + label: "Calculator", + icon: , + }, + { + id: "4", + label: "Settings", + icon: , + }, + ]; + + // Full items (grouped) - 20+ items to test scrolling + const fullItems: import("@/components/Command").CommandGroup[] = [ + { + label: "Suggestions", + items: [ + { + id: "1", + label: "Linear", + icon: , + shortcut: , + }, + { + id: "2", + label: "Figma", + icon: , + shortcut: , + }, + { + id: "3", + label: "Slack", + icon: , + shortcut: , + }, + { + id: "4", + label: "Notion", + icon: , + shortcut: , + }, + { + id: "5", + label: "GitHub", + icon: , + shortcut: , + }, + ], + }, + { + label: "Commands", + items: [ + { + id: "6", + label: "Clipboard History", + icon: , + shortcut: , + keywords: ["clipboard", "paste"], + }, + { + id: "7", + label: "System Preferences", + icon: , + shortcut: , + keywords: ["settings"], + }, + { + id: "8", + label: "Screenshot", + icon: , + shortcut: , + keywords: ["capture", "screen"], + }, + { + id: "9", + label: "Lock Screen", + icon: , + shortcut: , + }, + { + id: "10", + label: "Force Quit", + icon: , + shortcut: , + }, + ], + }, + { + label: "Navigation", + items: [ + { + id: "11", + label: "Go to Dashboard", + icon: , + }, + { + id: "12", + label: "Go to Settings", + icon: , + }, + { + id: "13", + label: "Go to Profile", + icon: , + }, + { + id: "14", + label: "Go to Notifications", + icon: , + }, + { + id: "15", + label: "Go to Help", + icon: , + }, + ], + }, + { + label: "Actions", + items: [ + { + id: "16", + label: "New Document", + icon: , + shortcut: , + }, + { + id: "17", + label: "New Folder", + icon: , + shortcut: , + }, + { + id: "18", + label: "Duplicate", + icon: , + shortcut: , + }, + { + id: "19", + label: "Delete", + icon: , + shortcut: , + }, + { + id: "20", + label: "Archive", + icon: , + shortcut: , + }, + ], + }, + ]; + + // Keyboard shortcut to open (Cmd+K) + React.useEffect(() => { + const down = (e: KeyboardEvent) => { + if (e.key === "k" && (e.metaKey || e.ctrlKey)) { + e.preventDefault(); + setFullOpen((open) => !open); + } + }; + document.addEventListener("keydown", down); + return () => document.removeEventListener("keydown", down); + }, []); + + return ( +
+ {/* Basic Command */} +
+ + Basic + + + +
+ + {/* Full Command with shortcuts and footer */} +
+ + With Groups, Shortcuts & Footer (⌘K to open) + + + + +
+ + Navigate +
+
+
+ Select + +
+
+ Close + +
+
+
+
+
+
+ ); +} + +function AutocompleteExamples() { + return ( +
+ {/* Basic */} +
+ + Basic + + + + + + + No results found. + + {(item: AutocompleteFruit) => ( + + {item.label} + + )} + + + + + +
+ + {/* With Leading Icons */} +
+ + With Leading Icons + + + + + + + No results found. + + {(item: AutocompleteFruit) => ( + } + > + {item.label} + + )} + + + + + +
+ + {/* Disabled */} +
+ + Disabled + + + + + + + + {(item: AutocompleteFruit) => ( + + {item.label} + + )} + + + + + +
+ + {/* Fuzzy Matching */} + +
+ ); +} + +function MenuExamples() { + const [showGrid, setShowGrid] = React.useState(true); + const [showRulers, setShowRulers] = React.useState(false); + const [sortBy, setSortBy] = React.useState("name"); + + return ( +
+ {/* Basic */} +
+ + Basic + + + }> + Open Menu + + + + + New File + Open File + Save + + Export + + + + +
+ + {/* With Icons */} +
+ + With Icons + + + }> + Edit + + + + + + + Edit + + + + Copy + + + + Delete + + + + + +
+ + {/* Checkbox Items */} +
+ + Checkbox Items + + + }> + View Options + + + + + + + + + Show Grid + + + + + + Show Rulers + + + + + +
+ + {/* Radio Items */} +
+ + Radio Items + + + }> + Sort By + + + + + + + + + + Name + + + + + + Date + + + + + + Size + + + + + + +
+ + {/* With Groups */} +
+ + With Groups + + + }> + Preferences + + + + + + Account + Profile + Settings + + + + Help + Documentation + Support + + + + + +
+ + {/* With Submenu */} +
+ + With Submenu + + + }> + File + + + + + New + Open + + + Share + + + + + + Email + Messages + AirDrop + + + + + + Close + + + + +
+
+ ); +} + +function MenubarDemo() { + return ( +
+
+ + Basic + + + + File + + + + New + Open + Save + + Export + + + + + + + Edit + + + + Undo + Redo + + Cut + Copy + Paste + + + + + + + View + + + + Zoom In + Zoom Out + + Full Screen + + + + + + + Help + + + + Documentation + About + + + + + +
+ +
+ + Disabled + + + + File + + + + New + + + + + + + Edit + + + + Cut + + + + + +
+
+ ); +} + +function ContextMenuExamples() { + const [showGrid, setShowGrid] = React.useState(true); + const [sortBy, setSortBy] = React.useState("name"); + + const TriggerArea = ({ children }: { children?: React.ReactNode }) => ( +
+ {children || "Right-click here"} +
+ ); + + return ( +
+
+ + Basic + + + + + + + + + Cut + Copy + Paste + + Delete + + + + +
+ +
+ + With Checkbox Items + + + + Right-click for view options + + + + + + + Show Grid + + + + + +
+ +
+ + With Radio Items + + + + Right-click to sort + + + + + + Sort by + + + + Name + + + + Date + + + + Size + + + + + + + +
+ +
+ + With Submenu + + + + + + + + + New + Open + + + Share + + + + + + Email + Messages + Copy Link + + + + + + Delete + + + + +
+
+ ); +} + +function PaginationDemo() { + const [page, setPage] = React.useState(1); + const [pageSize, setPageSize] = React.useState(100); + const totalItems = 2500; + + return ( +
+
+ + Default + + + + setPageSize(Number(v))} + > + + + + + + + + + + 10 + + + 25 + + + 50 + + + 100 + + + + + + + + + + + + +
+ +
+ + First Page (Previous disabled) + + + + + + + + + +
+ +
+ + Last Page (Next disabled) + + + + + + + + + +
+ +
+ + Single Page (both disabled) + + + + + + + + + +
+
+ ); +} + +// Phone Input demo data +const phoneCountries = [ + { code: "US", name: "United States", dialCode: "+1" }, + { code: "GB", name: "United Kingdom", dialCode: "+44" }, + { code: "DE", name: "Germany", dialCode: "+49" }, + { code: "FR", name: "France", dialCode: "+33" }, + { code: "JP", name: "Japan", dialCode: "+81" }, + { code: "AU", name: "Australia", dialCode: "+61" }, + { code: "CA", name: "Canada", dialCode: "+1" }, + { code: "IN", name: "India", dialCode: "+91" }, +]; + +type PhoneCountry = (typeof phoneCountries)[number]; + +// Circle-flags CDN URL helper +function getFlagUrl(code: string) { + return `https://hatscripts.github.io/circle-flags/flags/${code.toLowerCase()}.svg`; +} + +function PhoneInputDemo() { + const [country, setCountry] = React.useState(phoneCountries[0]); + const [phone, setPhone] = React.useState(""); + const [invalidCountry, setInvalidCountry] = React.useState( + phoneCountries[0], + ); + const [invalidPhone, setInvalidPhone] = React.useState(""); + + return ( +
+
+ + Default + + + v && setCountry(v)} + > + + + {(c: PhoneCountry) => ( + <> + + + + {c.dialCode} + + )} + + + + + {phoneCountries.map((c) => ( + + + + + + {c.name} ({c.dialCode}) + + + + ))} + + + setPhone(e.target.value)} + placeholder="Enter phone" + /> + +
+ +
+ + Invalid + + + v && setInvalidCountry(v)} + > + + + {(c: PhoneCountry) => ( + <> + + + + {c.dialCode} + + )} + + + + + {phoneCountries.map((c) => ( + + + + + + {c.name} ({c.dialCode}) + + + + ))} + + + setInvalidPhone(e.target.value)} + placeholder="Enter phone" + /> + +
+ +
+ + Disabled + + + + + + {(c: PhoneCountry) => ( + <> + + + + {c.dialCode} + + )} + + + + + {phoneCountries.map((c) => ( + + + + + + {c.name} ({c.dialCode}) + + + + ))} + + + + +
+
+ ); +} + +function ComboboxExamples() { + // Use the useFilter hook for filtering support + const filter = Combobox.useFilter(); + + return ( +
+ {/* Single Select with filtering */} +
+ + Single Select + + + + + + + + + + + + + + {(item: string) => ( + + + {item} + + )} + + + + + +
+ + {/* With Clear Button (shows next to chevron when value exists) */} +
+ + With Clear Button + + + + + + + + + + + + + + + {(item: string) => ( + + + {item} + + )} + + + + + +
+ + {/* With Trailing Icons */} +
+ + With Trailing Icons + + + + + + + + + + + + + + {(item: string) => ( + } + > + + {item} + + )} + + + + + +
+ + {/* With Leading Icons (indicator on right) */} +
+ + With Leading Icons + + + + + + + + + + + + + + {(item: string) => ( + } + > + {item} + + + )} + + + + + +
+ + {/* Multi Select - no chevron per Figma spec and Base UI pattern */} +
+ + Multi Select + + + + + + {(values: string[]) => ( + <> + {values?.map((value) => ( + + {value} + + + ))} + {/* Input is INSIDE Value - clicking anywhere opens popup */} + 0 ? "" : "Select fruits..."} + /> + + )} + + + {/* No ActionButtons/Trigger for multi-select - per Figma spec */} + + + + + + + {(item: string) => ( + + + {item} + + )} + + + + + +
+ + {/* Disabled */} +
+ + Disabled + + + + + + + + + + + + + {(item: string) => ( + + + {item} + + )} + + + + + +
+
+ ); +} + +// Table example data +interface TablePerson { + id: string; + name: string; + email: string; + role: string; + status: "active" | "inactive"; +} + +const tableData: TablePerson[] = [ + { + id: "1", + name: "Alice Johnson", + email: "alice@example.com", + role: "Engineer", + status: "active", + }, + { + id: "2", + name: "Bob Smith", + email: "bob@example.com", + role: "Designer", + status: "active", + }, + { + id: "3", + name: "Carol White", + email: "carol@example.com", + role: "Manager", + status: "inactive", + }, + { + id: "4", + name: "David Brown", + email: "david@example.com", + role: "Engineer", + status: "active", + }, + { + id: "5", + name: "Eve Davis", + email: "eve@example.com", + role: "Designer", + status: "active", + }, +]; + +const tableColumnHelper = createColumnHelper(); + +function TableExamples() { + const [sorting, setSorting] = React.useState([]); + const [rowSelection, setRowSelection] = React.useState({}); + + const columns = [ + tableColumnHelper.display({ + id: "select", + header: ({ table }) => ( + + + + ), + cell: ({ row }) => ( + + + + ), + meta: { variant: "checkbox" as const }, + }), + tableColumnHelper.accessor("name", { + header: "Name", + cell: (info) => ( + + ), + enableSorting: true, + }), + tableColumnHelper.accessor("role", { + header: "Role", + cell: (info) => info.getValue(), + enableSorting: true, + }), + tableColumnHelper.accessor("status", { + header: "Status", + cell: (info) => ( + + {info.getValue()} + + ), + enableSorting: false, + meta: { align: "right" as const }, + }), + ]; + + const table = useReactTable({ + data: tableData, + columns, + state: { sorting, rowSelection }, + onSortingChange: setSorting, + onRowSelectionChange: setRowSelection, + getCoreRowModel: getCoreRowModel(), + getSortedRowModel: getSortedRowModel(), + getRowId: (row) => row.id, + enableRowSelection: true, + }); + + const hasSelection = Object.keys(rowSelection).length > 0; + + return ( +
+ + + {table.getHeaderGroups().map((headerGroup) => ( + + {headerGroup.headers.map((header) => ( + + {header.isPlaceholder + ? null + : flexRender( + header.column.columnDef.header, + header.getContext(), + )} + + ))} + + ))} + + + {table.getRowModel().rows.map((row, index) => ( + + {row.getVisibleCells().map((cell) => ( + + {flexRender(cell.column.columnDef.cell, cell.getContext())} + + ))} + + ))} + + +
+ ); +} + +function LiveDemo() { + const [data, setData] = React.useState<{ time: number; value: number }[]>([]); + const [value, setValue] = React.useState(100); + const valueRef = React.useRef(100); + + React.useEffect(() => { + const now = Date.now() / 1000; + const seed: { time: number; value: number }[] = []; + let v = 100; + for (let i = 30; i >= 0; i--) { + v += (Math.random() - 0.5) * 4; + seed.push({ time: now - i, value: v }); + } + valueRef.current = v; + setData(seed); + setValue(v); + + const interval = setInterval(() => { + const t = Date.now() / 1000; + valueRef.current += (Math.random() - 0.5) * 3; + const next = valueRef.current; + setValue(next); + setData((prev) => { + const cutoff = t - 60; + const filtered = prev.filter((p) => p.time > cutoff); + return [...filtered, { time: t, value: next }]; + }); + }, 200); + + return () => clearInterval(interval); + }, []); + + return ( + v.toFixed(1)} + /> + ); +} + +const drawerRequests = [ + { + id: "ck8qs-177", + method: "GET", + path: "/customers", + status: 200, + duration: "314ms", + host: "api.example.com", + cache: "HIT", + }, + { + id: "ck8qs-178", + method: "POST", + path: "/transactions", + status: 201, + duration: "892ms", + host: "api.example.com", + cache: "MISS", + }, + { + id: "ck8qs-179", + method: "GET", + path: "/fees", + status: 200, + duration: "156ms", + host: "api.example.com", + cache: "HIT", + }, +]; + +function DrawerDemo() { + const [selected, setSelected] = React.useState< + (typeof drawerRequests)[0] | null + >(null); + + return ( +
+ + + + + + + + + + + {drawerRequests.map((req) => ( + setSelected(req)} + style={{ + borderBottom: "var(--stroke-xs) solid var(--border-primary)", + cursor: "pointer", + }} + onMouseOver={(e) => { + e.currentTarget.style.backgroundColor = "var(--surface-hover)"; + }} + onMouseOut={(e) => { + e.currentTarget.style.backgroundColor = ""; + }} + > + + + + + + ))} + +
+ Method + + Path + + Status + + Duration +
+ {req.method} + + {req.path} + + + {req.status} + + + {req.duration} +
+ + { + if (!open) setSelected(null); + }} + swipeDirection="right" + > + + + + + {selected && ( + <> +
+ + {selected.method} {selected.path} + +
+ + {selected.status} + + + } + > + + +
+
+ +
+
+ {[ + ["Request ID", selected.id], + ["Path", selected.path], + ["Host", selected.host], + ["Duration", selected.duration], + ["Cache", selected.cache], + ].map(([label, value]) => ( +
+ + {label} + + + {value} + +
+ ))} +
+
+
+ + )} +
+
+
+
+
+ ); +} + +function DatePickerDemo() { + const [singleDate, setSingleDate] = React.useState(null); + const [rangeValue, setRangeValue] = React.useState( + null, + ); + const [mode, setMode] = React.useState<"single" | "range">("range"); + const [includeTime, setIncludeTime] = React.useState(false); + + return ( +
+
+

+ Single date +

+ setSingleDate(v as Date)} + > + + + + + + + +
+
+

+ Date range +

+ + + + + + + { + setMode(v ? "range" : "single"); + setRangeValue(null); + }} + /> + + + + + + + + + +
+
+

+ French (locale) +

+ + + + + + + { + setMode(v ? "range" : "single"); + setRangeValue(null); + }} + /> + + + + + + + + + +
+
+ ); +} + +function SegmentedNavDemo({ + ariaLabel, + items, + initialActive, +}: { + ariaLabel: string; + items: string[]; + initialActive: string; +}) { + const [activeItem, setActiveItem] = React.useState(initialActive); + + return ( + + {items.map((item) => ( + { + event.preventDefault(); + setActiveItem(item); + }} + /> + } + > + {item} + + ))} + + ); +} + +function GroupedSegmentedNavDemo({ + ariaLabel, + groups, + initialActive, +}: { + ariaLabel: string; + groups: string[][]; + initialActive: string; +}) { + const [activeItem, setActiveItem] = React.useState(initialActive); + + return ( + + {groups.map((group, index) => ( + + {group.map((item) => ( + { + event.preventDefault(); + setActiveItem(item); + }} + /> + } + > + {item} + + ))} + + ))} + + ); +} + +export default function Home() { + return ( +
+ +

Origin

+

+ Design system rebuild — Base UI + Figma-first approach. +

+ +

Accordion Component

+ + + + + What is Origin? + + + Origin is a design system that combines Base UI for accessibility + and behavior with Figma Dev Mode CSS for pixel-perfect styling. + + + + + + How does it work? + + + Components are designed in Figma using tokenized properties. The + Figma lint plugin validates structure against Base UI anatomy. CSS + is extracted from Dev Mode and transformed to use semantic tokens. + + + + + + Why this approach? + + + This approach ensures perfect design-to-code fidelity while + maintaining full accessibility through Base UI primitives. + + + +

Action Bar Component

+ +
+ + 4 transactions selected + + + + + + + + 3 users selected + + + + + +
+

Alert Component

+ +
+ + + + +
+

Alert Dialog Component

+ +
+ + }> + Open Alert Dialog + + + + + Delete Item? + + This action cannot be undone. The item will be permanently + removed from your account. + + + }> + Cancel + + }> + Delete + + + + + + + + }> + Destructive Action + + + + + Are you sure? + + This will permanently delete your account and all associated + data. + + + }> + Cancel + + }> + Delete Account + + + + + +
+

Autocomplete Component

+ + +
+ +

Badge Component

+ +
+
+ Subtle: + Label + Label + Label + Label + Label + Label + Label + Label +
+
+ Vibrant: + + Label + + + Label + + + Label + + + Label + + + Label + + + Label + + + Label + + + Label + +
+
+

Breadcrumb Component

+ +
+
+ + Default + + + + + Home + + + Products + + + Shoes + + + +
+ +
+ + With Collapsed Items + + + + + Home + + + + + + + Running + + + + Trail Runners + + + +
+ +
+ + Custom Separator + + + + + Home + + + Products + + + Shoes + + + +
+
+

Button Component

+ + {/* Variants */} +
+ + + + + + +
+ + {/* Sizes */} +
+ + + +
+ + {/* With Icons */} +
+ + + +
+ + {/* Icon Only */} +
+
+ + {/* States */} +
+ + + +
+ + {/* Link Variant */} +
+ Link: + + + +
+

Button Group

+ +
+
+ + Filled horizontal + + + + + + +
+
+ + Outline horizontal + + + + + + +
+
+ + Secondary horizontal + + + + + + +
+
+ +
+
+ + Filled vertical + + + + + + +
+
+ + Outline vertical + + + + + + +
+
+ + Secondary vertical + + + + + + +
+
+
+ +

Card Component

+ +
+ + + + Structured + With card surface + + + +

Body content with sectioned layout.

+
+ + + +
+ + + + Simple + No card surface + + +

Body content with uniform padding.

+
+ +
+
+ +

Charts

+ +

Bar

+
+
+

+ Grouped +

+ +
+
+

+ Stacked +

+ +
+
+

+ Horizontal +

+ +
+
+

+ Single series + reference +

+ +
+
+ +

BarList

+
+
+ +
+
+ +

BarList (ranked)

+
+
+

+ With rank, change indicators, and secondary values +

+ `$${v.toLocaleString()}`} + formatSecondaryValue={(v) => `${v}%`} + showRank + /> +
+
+ +

Composed

+
+
+

+ Bar + line, dual Y-axes +

+ `${v}%`} + /> +
+
+ +

Donut

+
+
+ +
+
+ +
+
+ +

Funnel

+
+
+

+ Conversion pipeline +

+ v.toLocaleString()} + /> +
+
+ +

Gauge

+
+
+

+ Default +

+ `${v.toFixed(2)}s`} + /> +
+
+

+ Minimal +

+ `${v.toFixed(2)}s`} + /> +
+
+ +

Line

+
+
+

+ Multi-series with grid +

+ +
+
+

+ Area fill + fadeLeft +

+ +
+
+

+ Dashed + dotted series +

+ +
+
+

+ Reference lines +

+ +
+
+ +

Live (Real-Time)

+
+
+

+ Streaming data (random walk) +

+ +
+
+ +

Sankey

+
+
+

+ Budget allocation +

+ `$${v}k`} + /> +
+
+ +

Scatter

+
+
+

+ Multi-series with grid +

+ `${v}%`} + formatYLabel={(v) => `$${v}`} + /> +
+
+ +

Sparkline

+
+
+

+ Line +

+ +
+
+

+ Line +

+ +
+
+

+ Bar +

+ +
+
+ +

Split (Distribution)

+
+
+

+ Shade ramp +

+ `$${v.toLocaleString()}`} + showValues + /> +
+
+ +

Stacked Area

+
+
+ +
+
+ +

Tooltip Modes

+
+
+

+ simple +

+ +
+
+

+ compact +

+ +
+
+

+ detailed +

+ +
+
+ +

Uptime

+
+
+ ({ + status: (i === 12 + ? "down" + : i === 34 + ? "degraded" + : i === 67 + ? "down" + : i === 45 + ? "degraded" + : "up") as "up" | "down" | "degraded", + label: `Day ${i + 1}`, + }))} + label="90 days — 97.8% uptime" + /> +
+
+ +

Waterfall

+
+
+

+ Revenue breakdown +

+ `$${v}`} + /> +
+
+

Checkbox Component

+ +
+ {/* Default variant */} + + Legend + + + + + Help text goes here. + + + {/* Card variant */} + + Legend + + + + + Help text goes here. + + + {/* Critical state */} + + Legend + + + + + Error text goes here. + +
+

Chip Component

+ +
+
+ Default MD + console.log("dismissed")}>label +
+
+ Default SM + console.log("dismissed")}> + label + +
+
+ Filter MD + console.log("dismissed")} + /> +
+
+ Filter SM + console.log("dismissed")} + /> +
+
+ Disabled + console.log("dismissed")}> + label + +
+
+ No dismiss + label +
+
+

Collapsible

+ +
+ + Advanced settings + + These settings are for experienced users. Adjust log level, enable + debug mode, and configure custom telemetry endpoints. + + + + + Details + + This panel starts open by default. Useful for content that should be + visible on first load but dismissable. + + + + + Locked section + This content is locked. + +
+

Combobox Component

+ + +
+ +

Command Component

+ + +
+ +

Context Menu Component

+ + +
+ +

DatePicker

+ +
+ +

Dialog Component

+ +
+ + }> + Open Dialog + + + + + + + Dialog Title + + This is a description of the dialog content. + + + +

+ Dialog content goes here. This area can contain forms, text, + or any other content. +

+
+ + }> + Cancel + + + +
+
+
+ + + }> + Without Close Button + + + + + + No Close Button + + This dialog does not have an X close button. + + + +

+ The user must use the footer buttons or press Escape to close. +

+
+ + }> + Cancel + + }> + Done + + +
+
+
+
+

Drawer

+ + +
+ +

Field Component

+ +
+ + Default + + Help text goes here. + + + + Filled + + Help text goes here. + + + + Disabled + + Help text goes here. + + + + Invalid + + Error text goes here. + +
+

Fieldset Component

+ +
+
+ + Vertical (default) + + First Name + + Your legal first name. + + + Last Name + + Your legal last name. + + +
+
+ + Horizontal + + City + + + + State + + + + Zip + + + +
+
+

Form Component

+ +
+
{ + e.preventDefault(); + alert("Form submitted!"); + }} + > + + Email + + We'll never share your email. + + + Password + + + +
+
+

Input Component

+ +
+
+ + Default + + +
+
+ + Filled + + +
+
+ + Disabled + + +
+
+ + Read Only + + +
+
+

Input Group

+ +
+ + + + + + + + + + Search + + + + + Search + + + + + USD + + + + + + USD + + + + + https:// + + + + + + + Copy + + + + + + + + + + + + + + https:// + + + Go + + + + + + + + + + + + + + $ + + USD + + + + + + + + + + + + + + + +
+ +
+

Item Component

+ +
+ } + trailing={} + onClick={() => console.log("clicked")} + /> + } + trailing={} + clickable={false} + /> + } + onClick={() => console.log("clicked")} + /> + +
+

Loader Component

+ +
+ +
+

Logo Component

+ +
+
+ + Lightspark Logo Regular + + +
+
+ + Lightspark Logo Light + + +
+
+ + Lightspark Logomark Regular + + +
+
+ + Lightspark Logomark Light + + +
+
+ + Lightspark Wordmark + + +
+
+ + Grid Logo + + +
+
+ + Grid Logomark + + +
+
+

Menu Component

+ + +
+ +

Menubar Component

+ + +
+ +

Meter Component

+ +
+
+ + Storage (50%) + + + Storage used + + + + + +
+ +
+ + Low (25%) + + + Battery level + + + + + +
+ +
+ + High (90%) + + + Disk space + + + + + +
+ +
+ + Track Only + + + + + + +
+
+

Navigation Menu Component

+ +
+
+ + With Dropdown + + + + + + Products + + + + + + + + Dashboard + + + + Analytics + + + + Reports + + + + + + Resources + + + + + + + Documentation + + + API Reference + + Blog + + + + Pricing + + + + + + + + + + + +
+ +
+ + Links Only + + + + + Home + + + + About + + + + Contact + + + +
+ +
+ + With Group Labels + + + + + + Products + + + + + + + + Analytics + + + + Dashboard + + + + Reports + + + + + + Settings + + + + Preferences + + + + Account + + + + + + + + + + + + + + +
+ +
+ + With Actions + + + + + + Dashboard + + + + Settings + + + + + + + + + + + + + alert("Signed out!")}> + Sign Out + + + + +
+
+

Pagination Component

+ + + +
+

Phone Input Component

+ + + +
+

Popover Component

+ +
+ + }> + Notifications + + + + + + Notifications + + + You are all caught up. Good job! + + + + + + + + }> + Settings + + + + +
+ + Settings + + + + + } + /> +
+ + Adjust your notification preferences and alert thresholds. + +
+
+
+
+ + + }> + Modal Popover + + + + + +
+ + Confirm Action + + + This action requires your confirmation before proceeding. + +
+
+ } + > + Cancel + + } + > + Confirm + +
+
+
+
+
+
+

Preview Card

+ +
+ + + Hover to preview + + + + + +

+ A lightweight preview of the linked content +

+
+
+
+
+ + + + Rich preview + + + + +
+ +
+
+ + Typography Guide + + + Learn about text styles, mixins, and the type scale + +
+
+
+
+
+
+

Progress Component

+ +
+
+ + Default (50%) + + + Export data + + + + + +
+ +
+ + Complete (100%) + + + Upload complete + + + + + +
+ +
+ + Indeterminate + + + Loading... + + + + +
+ +
+ + Track Only + + + + + + +
+
+

Radio Component

+ +
+ {/* Default variant */} + + Legend + + + + + Help text goes here. + + + {/* Card variant */} + + Legend + + + + + Help text goes here. + + + {/* Critical state */} + + Legend + + + + + Error text goes here. + +
+

SegmentedNav Component

+ +
+
+ + Flat links + + +
+ +
+ + Grouped links + + +
+ +
+ + Longer labels + + +
+
+

Select Component

+ +
+
+ + Default + + + + + + + + + + + + + Apple + + + + Banana + + + + Orange + + + + + + +
+ +
+ + With Groups + + + + + + + + + + + + + Apple + + + + Banana + + + + + Vegetables + + + + Carrot + + + + Broccoli + + + + + + + +
+ +
+ + With Trailing Icons + + + + + + + + + + + } + > + + United States + + } + > + + United Kingdom + + } + > + + Germany + + + + + + +
+ +
+ + Disabled + + + + + + + + + + + + + Apple + + + + + + +
+ +
+ + Multi Select + + + + + {(selected: string[]) => { + if (selected.length === 0) { + return Select fruits; + } + const labels: Record = { + apple: "Apple", + banana: "Banana", + orange: "Orange", + }; + const first = labels[selected[0]]; + return selected.length === 1 + ? first + : `${first} +${selected.length - 1}`; + }} + + + + + + + + + + Apple + + + + Banana + + + + Orange + + + + + + +
+ +
+ + Ghost Variant (minimal inline) + + + + + + + + + + + + + Apple + + + + Banana + + + + Orange + + + + + + +
+ +
+ + Hybrid Variant (for navbars/toolbars) + +
+ Environment: + + + + {(value: string) => { + const labels: Record = { + production: "Production", + sandbox: "Sandbox", + staging: "Staging", + }; + return labels[value] || value; + }} + + + + + + + + + Production + + + + Sandbox + + + + Staging + + + + + + + +
+
+ +
+ + Hybrid Disabled + + + + + {(value: string) => { + const labels: Record = { + production: "Production", + sandbox: "Sandbox", + staging: "Staging", + }; + return labels[value] || value; + }} + + + + + + + + + Production + + + + + + + +
+ +
+ + Empty State + + + + + + + + + + No options available + + + + +
+
+

Separator Component

+ +
+

Shortcut Component

+ +
+
+ Single Key + +
+
+ Two Keys + +
+
+ Three Keys + +
+
+ Common +
+ + Copy + + + Paste + + + Undo + +
+
+
+

Sidebar Component

+ +
+
+ + + +
+ +
+
+ + + Default Items + + } + active + > + Dashboard + + } + trailing={} + > + Profile + + } + disabled + > + Disabled + + + + + + + + + Submenu (Vertical Chevron) + + + + } + label="Projects" + defaultOpen + > + } + > + Alpha + + } + active + > + Beta + + + + + + + + + + Tree (Horizontal Chevron) + + + + } + label="Files" + defaultOpen + > + } + > + Document + + + } + label="Nested" + > + } + > + Child + + + + + + + + + + Drilldown (Navigate) + + + } + > + Teams + + } + > + Members + + + + + + + } + > + Settings + + + +
+
+
+
+

Skeleton Component

+ +
+
+

+ Standalone +

+ +
+ +
+

+ Text lines (grouped) +

+ +
+ + + +
+
+
+ +
+

+ Avatar + name (grouped) +

+ +
+ +
+ + +
+
+
+
+ +
+

+ Card (grouped) +

+ +
+ + + +
+
+
+ +
+

+ Table rows (grouped) +

+ +
+ {Array.from({ length: 5 }).map((_, i) => ( +
+ + + +
+ ))} +
+
+
+ +
+

+ Form (grouped) +

+ +
+
+ + +
+
+ + +
+ +
+
+
+ +
+

+ On surface-secondary +

+
+ +
+ +
+ + +
+
+
+
+
+ +
+

+ On surface-tertiary +

+
+ +
+ +
+ + +
+
+
+
+
+ +
+

+ On dark surface +

+
+ +
+ +
+ + +
+
+
+
+
+
+ +

Switch Component

+ +
+
+ SM Off + +
+
+ SM On + +
+
+ MD Off + +
+
+ MD On + +
+
+ Disabled Off + +
+
+ Disabled On + +
+
+ Read Only + +
+
+

Table Component

+ + +
+ +

Tabs Component

+ +
+
+ + Default Variant + + + + Account + Password + Settings + + + Manage your account settings and preferences. + + + Change your password and security options. + + + Configure application settings. + + +
+ +
+ + Minimal Variant + + + + Overview + Details + History + + + Overview content without container background. + + Details content. + History content. + +
+ +
+ + With Disabled Tab + + + + Active + + Disabled + + Another + + This tab is active. + + This panel cannot be accessed. + + Another tab content. + +
+
+

Textarea

+ +
+
+ + Default + +