diff --git a/docs/pkg/core.md b/docs/pkg/core.md new file mode 100644 index 0000000..695ae5d --- /dev/null +++ b/docs/pkg/core.md @@ -0,0 +1,610 @@ +# pkg/core -- Dependency Injection & Service Framework + +`pkg/core` is the foundation of the Core application framework. It provides a dependency injection container, service lifecycle management, and a message bus for inter-service communication. Every other package in the ecosystem builds on top of it. + +The package is designed for use with Wails v3 (desktop GUI) but is equally useful in CLI and headless applications. + +--- + +## Core Struct + +`Core` is the central application object. It owns the service registry, the message bus, embedded assets, and feature flags. + +```go +type Core struct { + App any // GUI runtime (e.g. Wails App), set by WithApp + Features *Features // Feature flags + // unexported: svc *serviceManager, bus *messageBus, assets embed.FS +} +``` + +### Creating a Core Instance + +`New()` is the sole constructor. It accepts a variadic list of `Option` functions that configure the instance before it is returned. After all options are applied, the service lock is finalised. + +```go +c, err := core.New( + core.WithService(mypackage.NewMyService), + core.WithAssets(embeddedFS), + core.WithServiceLock(), +) +``` + +If any option returns an error, `New()` returns `nil` and that error immediately. + +### Options + +| Option | Purpose | +|--------|---------| +| `WithService(factory)` | Register a service via factory function. Auto-discovers the service name from the factory's return type package path and auto-registers an IPC handler if the service has a `HandleIPCEvents` method. | +| `WithName(name, factory)` | Register a service with an explicit name. Does **not** auto-discover IPC handlers. | +| `WithApp(app)` | Inject a GUI runtime (e.g. Wails `*application.App`) into `Core.App`. | +| `WithAssets(fs)` | Attach an `embed.FS` containing frontend assets. | +| `WithServiceLock()` | Prevent any further service registration after `New()` completes. Calls to `RegisterService` after the lock is applied return an error. | + +The `Option` type is defined as: + +```go +type Option func(*Core) error +``` + +### Service Retrieval + +Services are retrieved by name. Two generic helpers provide type-safe access: + +```go +// Returns (T, error) -- safe version +svc, err := core.ServiceFor[*MyService](c, "myservice") + +// Panics if not found or wrong type -- use in init paths +svc := core.MustServiceFor[*MyService](c, "myservice") +``` + +The untyped `Service(name)` method returns `any` (or `nil` if not found). + +### Convenience Accessors + +`Core` provides shorthand methods for well-known services: + +```go +c.Config() // returns Config interface +c.Display() // returns Display interface +c.Workspace() // returns Workspace interface +c.Crypt() // returns Crypt interface +``` + +Each calls `MustServiceFor` internally and will panic if the named service is not registered. + +### Global Instance + +For GUI runtimes that require global access, a singleton pattern is available: + +```go +core.SetInstance(c) // store globally (thread-safe) +app := core.App() // retrieve Core.App (panics if not set) +inst := core.GetInstance() // retrieve *Core (returns nil if not set) +core.ClearInstance() // reset to nil (primarily for tests) +``` + +### Feature Flags + +The `Features` struct holds a simple string slice of enabled flags: + +```go +c.Features.Flags = []string{"dark-mode", "beta-api"} +c.Features.IsEnabled("dark-mode") // true +``` + +--- + +## Service Pattern + +### Factory Functions + +Services are created via factory functions that receive the `*Core` and return `(any, error)`: + +```go +func NewMyService(c *core.Core) (any, error) { + return &MyService{ + ServiceRuntime: core.NewServiceRuntime(c, MyOptions{BufferSize: 64}), + }, nil +} +``` + +The factory is called during `New()` when the corresponding `WithService` or `WithName` option is processed. + +### ServiceRuntime[T] + +`ServiceRuntime[T]` is a generic helper struct that services embed to gain access to the `Core` instance and typed options: + +```go +type ServiceRuntime[T any] struct { + core *core.Core + opts T +} +``` + +Constructor: + +```go +rt := core.NewServiceRuntime[MyOptions](c, MyOptions{BufferSize: 64}) +``` + +Methods: + +| Method | Returns | +|--------|---------| +| `Core()` | `*Core` -- the parent container | +| `Opts()` | `T` -- the service's typed options | +| `Config()` | `Config` -- shorthand for `Core().Config()` | + +Example service: + +```go +type MyService struct { + *core.ServiceRuntime[MyOptions] + items map[string]string +} + +type MyOptions struct { + BufferSize int +} + +func NewMyService(c *core.Core) (any, error) { + return &MyService{ + ServiceRuntime: core.NewServiceRuntime(c, MyOptions{BufferSize: 128}), + items: make(map[string]string), + }, nil +} +``` + +### Startable and Stoppable Interfaces + +Services that need lifecycle hooks implement one or both of: + +```go +type Startable interface { + OnStartup(ctx context.Context) error +} + +type Stoppable interface { + OnShutdown(ctx context.Context) error +} +``` + +The service manager detects these interfaces at registration time and stores references internally. + +- **Startup**: `ServiceStartup()` calls `OnStartup` on every `Startable` service in registration order, then broadcasts `ActionServiceStartup{}` via the message bus. +- **Shutdown**: `ServiceShutdown()` first broadcasts `ActionServiceShutdown{}`, then calls `OnShutdown` on every `Stoppable` service in **reverse** registration order. This ensures that services which were started last are stopped first, respecting dependency order. + +Errors from individual services are aggregated via `errors.Join` and returned together, so one failing service does not prevent others from completing their lifecycle. + +### Service Lock + +When `WithServiceLock()` is passed to `New()`, the `serviceManager` sets `lockEnabled = true` during option processing. After all options have been applied, `applyLock()` sets `locked = true`. Any subsequent call to `RegisterService` returns an error: + +``` +core: service "late-service" is not permitted by the serviceLock setting +``` + +This prevents accidental late-binding of services after the application has been fully wired. + +### Service Name Discovery + +`WithService` derives the service name from the Go package path of the returned struct. For a type `myapp/services.Calculator`, the name becomes `services`. For `myapp/calculator.Service`, it becomes `calculator`. + +To control the name explicitly, use `WithName("calc", factory)`. + +### IPC Handler Discovery + +`WithService` also checks whether the service has a method named `HandleIPCEvents` with signature `func(*Core, Message) error`. If found, it is automatically registered as an ACTION handler via `RegisterAction`. + +`WithName` does **not** perform this discovery. Register handlers manually if needed. + +--- + +## Message Bus + +The message bus provides three distinct communication patterns, all thread-safe: + +### 1. ACTION -- Fire-and-Forget Broadcast + +`ACTION` dispatches a message to **all** registered handlers. Every handler is called; errors are aggregated. + +```go +// Define a message type +type OrderPlaced struct { + OrderID string + Total float64 +} + +// Dispatch +err := c.ACTION(OrderPlaced{OrderID: "abc", Total: 42.50}) + +// Register a handler +c.RegisterAction(func(c *core.Core, msg core.Message) error { + switch m := msg.(type) { + case OrderPlaced: + log.Printf("Order %s placed for %.2f", m.OrderID, m.Total) + } + return nil +}) +``` + +Multiple handlers can be registered at once with `RegisterActions(h1, h2, h3)`. + +The `Message` type is defined as `any`, so any struct can serve as a message. Handlers use a type switch to filter messages they care about. + +**Built-in action messages:** + +| Message | Broadcast when | +|---------|---------------| +| `ActionServiceStartup{}` | After all `Startable.OnStartup` calls complete | +| `ActionServiceShutdown{}` | Before `Stoppable.OnShutdown` calls begin | +| `ActionTaskStarted{TaskID, Task}` | A `PerformAsync` task begins | +| `ActionTaskProgress{TaskID, Task, Progress, Message}` | A background task reports progress | +| `ActionTaskCompleted{TaskID, Task, Result, Error}` | A `PerformAsync` task finishes | + +### 2. QUERY -- Read-Only Request/Response + +`QUERY` dispatches a query to handlers until the **first** one responds (returns `handled = true`). Remaining handlers are skipped. + +```go +type GetUserByID struct { + ID string +} + +// Register +c.RegisterQuery(func(c *core.Core, q core.Query) (any, bool, error) { + switch req := q.(type) { + case GetUserByID: + user, err := db.Find(req.ID) + return user, true, err + } + return nil, false, nil // not handled -- pass to next handler +}) + +// Dispatch +result, handled, err := c.QUERY(GetUserByID{ID: "u-123"}) +if !handled { + // no handler recognised this query +} +user := result.(*User) +``` + +`QUERYALL` dispatches the query to **all** handlers and collects every non-nil result: + +```go +results, err := c.QUERYALL(ListPlugins{}) +// results is []any containing responses from every handler that responded +``` + +The `Query` type is `any`. The `QueryHandler` signature is: + +```go +type QueryHandler func(*Core, Query) (any, bool, error) +``` + +### 3. TASK -- Side-Effect Request/Response + +`PERFORM` dispatches a task to handlers until the **first** one executes it (returns `handled = true`). Semantically identical to `QUERY` but intended for operations with side effects. + +```go +type SendEmail struct { + To string + Subject string + Body string +} + +c.RegisterTask(func(c *core.Core, t core.Task) (any, bool, error) { + switch task := t.(type) { + case SendEmail: + err := mailer.Send(task.To, task.Subject, task.Body) + return nil, true, err + } + return nil, false, nil +}) + +result, handled, err := c.PERFORM(SendEmail{ + To: "user@example.com", + Subject: "Welcome", + Body: "Hello!", +}) +``` + +The `Task` type is `any`. The `TaskHandler` signature is: + +```go +type TaskHandler func(*Core, Task) (any, bool, error) +``` + +### Background Tasks + +`PerformAsync` runs a `PERFORM` dispatch in a background goroutine and returns a task ID immediately: + +```go +taskID := c.PerformAsync(BuildProject{Path: "/src"}) +// taskID is "task-1", "task-2", etc. +``` + +The framework automatically broadcasts: + +1. `ActionTaskStarted` -- when the goroutine begins +2. `ActionTaskCompleted` -- when the task finishes (includes `Result` and `Error`) + +If the task implements `TaskWithID`, the framework injects the assigned ID before execution: + +```go +type TaskWithID interface { + Task + SetTaskID(id string) + GetTaskID() string +} +``` + +Services can report progress during long-running tasks: + +```go +c.Progress(taskID, 0.5, "Compiling 50%...", task) +// Broadcasts ActionTaskProgress{TaskID: taskID, Progress: 0.5, Message: "..."} +``` + +### Thread Safety + +The message bus uses `sync.RWMutex` for each handler slice (IPC, query, task). Handler registration acquires a write lock; dispatch acquires a read lock and copies the handler slice before iterating, so dispatches never block registrations. + +--- + +## Error Handling + +The `Error` struct provides contextual error wrapping: + +```go +type Error struct { + Op string // operation, e.g. "config.Load" + Msg string // human-readable description + Err error // underlying error (optional) +} +``` + +### E() Helper + +`E()` is the primary constructor: + +```go +return core.E("config.Load", "failed to read config file", err) +// Output: "config.Load: failed to read config file: " + +return core.E("auth.Login", "invalid credentials", nil) +// Output: "auth.Login: invalid credentials" +``` + +When `err` is `nil`, the resulting `Error` has no wrapped cause. + +### Error Chain Compatibility + +`Error` implements `Unwrap()`, so it works with `errors.Is()` and `errors.As()`: + +```go +var coreErr *core.Error +if errors.As(err, &coreErr) { + log.Printf("Operation: %s, Message: %s", coreErr.Op, coreErr.Msg) +} +``` + +### Convention + +The `Op` field should follow `package.Function` or `service.Method` format. The `Msg` field should be a human-readable sentence suitable for display to end users. + +--- + +## Runtime (Wails Integration) + +The `Runtime` struct wraps `Core` for use as a Wails service. It implements the Wails service interface (`ServiceName`, `ServiceStartup`, `ServiceShutdown`). + +```go +type Runtime struct { + app any // GUI runtime + Core *Core +} +``` + +### NewRuntime + +Creates a minimal runtime with no custom services: + +```go +rt, err := core.NewRuntime(wailsApp) +``` + +### NewWithFactories + +Creates a runtime with named service factories. Factories are called in sorted (alphabetical) order to ensure deterministic initialisation: + +```go +rt, err := core.NewWithFactories(wailsApp, map[string]core.ServiceFactory{ + "calculator": func() (any, error) { return &Calculator{}, nil }, + "logger": func() (any, error) { return &Logger{}, nil }, +}) +``` + +`ServiceFactory` is defined as `func() (any, error)` -- note it does **not** receive `*Core`, unlike the `WithService` factory. The `Runtime` wraps each factory result with `WithName` internally. + +### Lifecycle Delegation + +`Runtime.ServiceStartup` and `Runtime.ServiceShutdown` delegate directly to `Core.ServiceStartup` and `Core.ServiceShutdown`. The Wails runtime calls these automatically. + +```go +func (r *Runtime) ServiceStartup(ctx context.Context, options any) { + _ = r.Core.ServiceStartup(ctx, options) +} + +func (r *Runtime) ServiceShutdown(ctx context.Context) { + if r.Core != nil { + _ = r.Core.ServiceShutdown(ctx) + } +} +``` + +--- + +## Interfaces + +`pkg/core` defines several interfaces that services may implement or consume. These decouple services from concrete implementations. + +### Lifecycle Interfaces + +| Interface | Method | Purpose | +|-----------|--------|---------| +| `Startable` | `OnStartup(ctx) error` | Initialisation on app start | +| `Stoppable` | `OnShutdown(ctx) error` | Cleanup on app shutdown | + +### Well-Known Service Interfaces + +| Interface | Service name | Key methods | +|-----------|-------------|-------------| +| `Config` | `"config"` | `Get(key, out) error`, `Set(key, v) error` | +| `Display` | `"display"` | `OpenWindow(opts...) error` | +| `Workspace` | `"workspace"` | `CreateWorkspace`, `SwitchWorkspace`, `WorkspaceFileGet`, `WorkspaceFileSet` | +| `Crypt` | `"crypt"` | `CreateKeyPair`, `EncryptPGP`, `DecryptPGP` | + +These interfaces live in `interfaces.go` and define the contracts that concrete implementations must satisfy. + +### Contract + +The `Contract` struct configures resilience behaviour: + +```go +type Contract struct { + DontPanic bool // recover from panics, return errors instead + DisableLogging bool // suppress all logging +} +``` + +--- + +## Complete Example + +Putting it all together -- a service that stores items, broadcasts actions, and responds to queries: + +```go +package inventory + +import ( + "context" + "sync" + + "forge.lthn.ai/core/go/pkg/core" +) + +// Options configures the inventory service. +type Options struct { + MaxItems int +} + +// Service manages an inventory of items. +type Service struct { + *core.ServiceRuntime[Options] + items map[string]string + mu sync.RWMutex +} + +// NewService creates a factory for Core registration. +func NewService(opts Options) func(*core.Core) (any, error) { + return func(c *core.Core) (any, error) { + if opts.MaxItems == 0 { + opts.MaxItems = 1000 + } + return &Service{ + ServiceRuntime: core.NewServiceRuntime(c, opts), + items: make(map[string]string), + }, nil + } +} + +// OnStartup registers query and task handlers. +func (s *Service) OnStartup(ctx context.Context) error { + s.Core().RegisterQuery(s.handleQuery) + s.Core().RegisterTask(s.handleTask) + return nil +} + +// -- Query: look up an item -- + +type GetItem struct{ ID string } + +func (s *Service) handleQuery(c *core.Core, q core.Query) (any, bool, error) { + switch req := q.(type) { + case GetItem: + s.mu.RLock() + val, ok := s.items[req.ID] + s.mu.RUnlock() + if !ok { + return nil, true, core.E("inventory.GetItem", "not found", nil) + } + return val, true, nil + } + return nil, false, nil +} + +// -- Task: add an item -- + +type AddItem struct { + ID string + Name string +} + +type ItemAdded struct { + ID string + Name string +} + +func (s *Service) handleTask(c *core.Core, t core.Task) (any, bool, error) { + switch task := t.(type) { + case AddItem: + s.mu.Lock() + s.items[task.ID] = task.Name + s.mu.Unlock() + + _ = c.ACTION(ItemAdded{ID: task.ID, Name: task.Name}) + return task.ID, true, nil + } + return nil, false, nil +} + +// -- Wiring it up -- + +func main() { + c, err := core.New( + core.WithName("inventory", NewService(Options{MaxItems: 500})), + core.WithServiceLock(), + ) + if err != nil { + panic(err) + } + + // Start lifecycle + _ = c.ServiceStartup(context.Background(), nil) + + // Use the bus + _, _, _ = c.PERFORM(AddItem{ID: "item-1", Name: "Widget"}) + result, _, _ := c.QUERY(GetItem{ID: "item-1"}) + // result == "Widget" + + // Shutdown + _ = c.ServiceShutdown(context.Background()) +} +``` + +--- + +## File Map + +| File | Responsibility | +|------|---------------| +| `core.go` | `New()`, options (`WithService`, `WithName`, `WithApp`, `WithAssets`, `WithServiceLock`), `ServiceFor[T]`, `MustServiceFor[T]`, lifecycle dispatch, global instance, bus method delegation | +| `interfaces.go` | `Core` struct definition, `Option`, `Message`, `Query`, `Task`, `QueryHandler`, `TaskHandler`, `Startable`, `Stoppable`, `Contract`, `Features`, well-known service interfaces (`Config`, `Display`, `Workspace`, `Crypt`), built-in action message types | +| `message_bus.go` | `messageBus` struct, `action()`, `query()`, `queryAll()`, `perform()`, handler registration | +| `service_manager.go` | `serviceManager` struct, service registry, `Startable`/`Stoppable` tracking, service lock mechanism | +| `runtime_pkg.go` | `ServiceRuntime[T]` generic helper, `Runtime` struct (Wails integration), `NewRuntime()`, `NewWithFactories()` | +| `e.go` | `Error` struct, `E()` constructor, `Unwrap()` for error chain compatibility | diff --git a/pkg/core/docs/site/404.html b/pkg/core/docs/site/404.html deleted file mode 100644 index e0fae56..0000000 --- a/pkg/core/docs/site/404.html +++ /dev/null @@ -1,707 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - Core.Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
- - - - - - - - - -
- -

404 - Not found

- -
-
- - - - - -
- - - -
- -
- - -
- -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/pkg/core/docs/site/assets/external/fonts.googleapis.com/css.49ea35f2.css b/pkg/core/docs/site/assets/external/fonts.googleapis.com/css.49ea35f2.css deleted file mode 100644 index d5c0c14..0000000 --- a/pkg/core/docs/site/assets/external/fonts.googleapis.com/css.49ea35f2.css +++ /dev/null @@ -1,756 +0,0 @@ -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkC3kaWzU.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkAnkaWzU.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCnkaWzU.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBXkaWzU.woff2) format('woff2'); - unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; -} -/* math */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkenkaWzU.woff2) format('woff2'); - unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; -} -/* symbols */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkaHkaWzU.woff2) format('woff2'); - unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCXkaWzU.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCHkaWzU.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBnka.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkC3kaWzU.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkAnkaWzU.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCnkaWzU.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBXkaWzU.woff2) format('woff2'); - unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; -} -/* math */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkenkaWzU.woff2) format('woff2'); - unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; -} -/* symbols */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkaHkaWzU.woff2) format('woff2'); - unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCXkaWzU.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCHkaWzU.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBnka.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkC3kaWzU.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkAnkaWzU.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCnkaWzU.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBXkaWzU.woff2) format('woff2'); - unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; -} -/* math */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkenkaWzU.woff2) format('woff2'); - unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; -} -/* symbols */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkaHkaWzU.woff2) format('woff2'); - unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCXkaWzU.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCHkaWzU.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: italic; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBnka.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2) format('woff2'); - unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; -} -/* math */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2) format('woff2'); - unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; -} -/* symbols */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2) format('woff2'); - unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2) format('woff2'); - unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; -} -/* math */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2) format('woff2'); - unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; -} -/* symbols */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2) format('woff2'); - unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2) format('woff2'); - unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; -} -/* math */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2) format('woff2'); - unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; -} -/* symbols */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2) format('woff2'); - unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - font-stretch: 100%; - font-display: fallback; - src: url(../fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto Mono'; - font-style: italic; - font-weight: 400; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3CWWoKC.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto Mono'; - font-style: italic; - font-weight: 400; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3mWWoKC.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek */ -@font-face { - font-family: 'Roboto Mono'; - font-style: italic; - font-weight: 400; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm36WWoKC.woff2) format('woff2'); - unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto Mono'; - font-style: italic; - font-weight: 400; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3KWWoKC.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto Mono'; - font-style: italic; - font-weight: 400; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3OWWoKC.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto Mono'; - font-style: italic; - font-weight: 400; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm32WWg.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto Mono'; - font-style: italic; - font-weight: 700; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3CWWoKC.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto Mono'; - font-style: italic; - font-weight: 700; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3mWWoKC.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek */ -@font-face { - font-family: 'Roboto Mono'; - font-style: italic; - font-weight: 700; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm36WWoKC.woff2) format('woff2'); - unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto Mono'; - font-style: italic; - font-weight: 700; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3KWWoKC.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto Mono'; - font-style: italic; - font-weight: 700; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3OWWoKC.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto Mono'; - font-style: italic; - font-weight: 700; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm32WWg.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto Mono'; - font-style: normal; - font-weight: 400; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhGq3-OXg.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto Mono'; - font-style: normal; - font-weight: 400; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhPq3-OXg.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek */ -@font-face { - font-family: 'Roboto Mono'; - font-style: normal; - font-weight: 400; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhIq3-OXg.woff2) format('woff2'); - unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto Mono'; - font-style: normal; - font-weight: 400; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhEq3-OXg.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto Mono'; - font-style: normal; - font-weight: 400; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhFq3-OXg.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto Mono'; - font-style: normal; - font-weight: 400; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhLq38.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto Mono'; - font-style: normal; - font-weight: 700; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhGq3-OXg.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto Mono'; - font-style: normal; - font-weight: 700; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhPq3-OXg.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek */ -@font-face { - font-family: 'Roboto Mono'; - font-style: normal; - font-weight: 700; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhIq3-OXg.woff2) format('woff2'); - unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto Mono'; - font-style: normal; - font-weight: 700; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhEq3-OXg.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto Mono'; - font-style: normal; - font-weight: 700; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhFq3-OXg.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto Mono'; - font-style: normal; - font-weight: 700; - font-display: fallback; - src: url(../fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhLq38.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkAnkaWzU.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkAnkaWzU.woff2 deleted file mode 100644 index ab38fd5..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkAnkaWzU.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBXkaWzU.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBXkaWzU.woff2 deleted file mode 100644 index db65849..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBXkaWzU.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBnka.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBnka.woff2 deleted file mode 100644 index 7c9cbed..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBnka.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkC3kaWzU.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkC3kaWzU.woff2 deleted file mode 100644 index e0aa393..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkC3kaWzU.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCHkaWzU.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCHkaWzU.woff2 deleted file mode 100644 index b677130..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCHkaWzU.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCXkaWzU.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCXkaWzU.woff2 deleted file mode 100644 index 669ba79..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCXkaWzU.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCnkaWzU.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCnkaWzU.woff2 deleted file mode 100644 index 6cc1de8..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCnkaWzU.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkaHkaWzU.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkaHkaWzU.woff2 deleted file mode 100644 index ded8a41..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkaHkaWzU.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkenkaWzU.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkenkaWzU.woff2 deleted file mode 100644 index dbac481..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkenkaWzU.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2 deleted file mode 100644 index 8e0eec6..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3-UBGEe.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2 deleted file mode 100644 index 0ddf16c..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3CUBGEe.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2 deleted file mode 100644 index 7bd3c2e..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3GUBGEe.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2 deleted file mode 100644 index 8e43aa4..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBGEe.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2 deleted file mode 100644 index 2c6ba19..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3OUBGEe.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2 deleted file mode 100644 index 2f8b493..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3iUBGEe.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2 deleted file mode 100644 index 7c16c79..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2 deleted file mode 100644 index c2788c7..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMawCUBGEe.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2 deleted file mode 100644 index 528b3bf..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/roboto/v49/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMaxKUBGEe.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhEq3-OXg.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhEq3-OXg.woff2 deleted file mode 100644 index 2c06834..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhEq3-OXg.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhFq3-OXg.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhFq3-OXg.woff2 deleted file mode 100644 index 532a888..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhFq3-OXg.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhGq3-OXg.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhGq3-OXg.woff2 deleted file mode 100644 index b02e2d6..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhGq3-OXg.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhIq3-OXg.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhIq3-OXg.woff2 deleted file mode 100644 index ae2f9eb..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhIq3-OXg.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhLq38.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhLq38.woff2 deleted file mode 100644 index bfa169c..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhLq38.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhPq3-OXg.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhPq3-OXg.woff2 deleted file mode 100644 index 8a15f5c..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x5DF4xlVMF-BfR8bXMIjhPq3-OXg.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm32WWg.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm32WWg.woff2 deleted file mode 100644 index d1ee097..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm32WWg.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm36WWoKC.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm36WWoKC.woff2 deleted file mode 100644 index c8e6ed4..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm36WWoKC.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3CWWoKC.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3CWWoKC.woff2 deleted file mode 100644 index 1debc1b..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3CWWoKC.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3KWWoKC.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3KWWoKC.woff2 deleted file mode 100644 index 43f7516..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3KWWoKC.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3OWWoKC.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3OWWoKC.woff2 deleted file mode 100644 index 227f362..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3OWWoKC.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3mWWoKC.woff2 b/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3mWWoKC.woff2 deleted file mode 100644 index 10a65a7..0000000 Binary files a/pkg/core/docs/site/assets/external/fonts.gstatic.com/s/robotomono/v31/L0x7DF4xlVMF-BfR8bXMIjhOm3mWWoKC.woff2 and /dev/null differ diff --git a/pkg/core/docs/site/assets/external/unpkg.com/iframe-worker/shim.js b/pkg/core/docs/site/assets/external/unpkg.com/iframe-worker/shim.js deleted file mode 100644 index 5f1e232..0000000 --- a/pkg/core/docs/site/assets/external/unpkg.com/iframe-worker/shim.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(()=>{function c(s,n){parent.postMessage(s,n||"*")}function d(...s){return s.reduce((n,e)=>n.then(()=>new Promise(r=>{let t=document.createElement("script");t.src=e,t.onload=r,document.body.appendChild(t)})),Promise.resolve())}var o=class extends EventTarget{constructor(e){super();this.url=e;this.m=e=>{e.source===this.w&&(this.dispatchEvent(new MessageEvent("message",{data:e.data})),this.onmessage&&this.onmessage(e))};this.e=(e,r,t,i,m)=>{if(r===`${this.url}`){let a=new ErrorEvent("error",{message:e,filename:r,lineno:t,colno:i,error:m});this.dispatchEvent(a),this.onerror&&this.onerror(a)}};let r=document.createElement("iframe");r.hidden=!0,document.body.appendChild(this.iframe=r),this.w.document.open(),this.w.document.write(` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
- - - - - - - - - -
- - - - - - - -

Core.Config

-

Short: App config and UI state persistence.

-

Overview

-

Stores and retrieves configuration, including window positions/sizes and user prefs.

-

Setup

-
package main
-
-import (
-  core "github.com/Snider/Core"
-  config "github.com/Snider/Core/config"
-)
-
-app := core.New(
-  core.WithService(config.Register),
-  core.WithServiceLock(),
-)
-
-

Use

-
    -
  • Persist UI state automatically when using Core.Display.
  • -
  • Read/write your own settings via the config API.
  • -
-

API

-
    -
  • Register(c *core.Core) error
  • -
  • Get(path string, out any) error
  • -
  • Set(path string, v any) error
  • -
- - - - - - - - - - -
-
- - - - - -
- - - -
- -
- - -
- -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/pkg/core/docs/site/core/crypt.html b/pkg/core/docs/site/core/crypt.html deleted file mode 100644 index 7c4fbfe..0000000 --- a/pkg/core/docs/site/core/crypt.html +++ /dev/null @@ -1,934 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Core.Crypt - Core.Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
- - - - - - - - - -
- - - - - - - -

Core.Crypt

-

Short: Keys, encrypt/decrypt, sign/verify.

-

Overview

-

Simple wrappers around OpenPGP for common crypto tasks.

-

Setup

-
import (
-  core "github.com/Snider/Core"
-  crypt "github.com/Snider/Core/crypt"
-)
-
-app := core.New(
-  core.WithService(crypt.Register),
-  core.WithServiceLock(),
-)
-
-

Use

-
    -
  • Generate keys
  • -
  • Encrypt/decrypt data
  • -
  • Sign/verify messages
  • -
-

API

-
    -
  • Register(c *core.Core) error
  • -
  • GenerateKey(opts ...Option) (*Key, error)
  • -
  • Encrypt(pub *Key, data []byte) ([]byte, error)
  • -
  • Decrypt(priv *Key, data []byte) ([]byte, error)
  • -
  • Sign(priv *Key, data []byte) ([]byte, error)
  • -
  • Verify(pub *Key, data, sig []byte) error
  • -
-

Notes

- - - - - - - - - - - -
-
- - - - - -
- - - -
- -
- - -
- -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/pkg/core/docs/site/core/display.html b/pkg/core/docs/site/core/display.html deleted file mode 100644 index 85d104c..0000000 --- a/pkg/core/docs/site/core/display.html +++ /dev/null @@ -1,936 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Core.Display - Core.Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
- - - - - - - - - -
- - - - - - - -

Core.Display

-

Short: Windows, tray, and window state.

-

Overview

-

Manages Wails windows, remembers positions/sizes, exposes JS bindings, and integrates with Core.Config for persistence.

-

Setup

-
import (
-  core "github.com/Snider/Core"
-  display "github.com/Snider/Core/display"
-)
-
-app := core.New(
-  core.WithService(display.Register),
-  core.WithServiceLock(),
-)
-
-

Use

-
    -
  • Open a window: OpenWindow(OptName("main"), ...)
  • -
  • Get a window: Window("main")
  • -
  • Save/restore state automatically when Core.Config is present
  • -
-

API

-
    -
  • Register(c *core.Core) error
  • -
  • OpenWindow(opts ...Option) *Window
  • -
  • Window(name string) *Window
  • -
  • Options: OptName, OptWidth, OptHeight, OptURL, OptTitle
  • -
-

Example

-
func (d *API) ServiceStartup(ctx context.Context, _ application.ServiceOptions) error {
-  d.OpenWindow(
-    OptName("main"), OptWidth(1280), OptHeight(900), OptURL("/"), OptTitle("Core"),
-  )
-  return nil
-}
-
- - - - - - - - - - -
-
- - - - - -
- - - -
- -
- - -
- -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/pkg/core/docs/site/core/docs.html b/pkg/core/docs/site/core/docs.html deleted file mode 100644 index dc90d1f..0000000 --- a/pkg/core/docs/site/core/docs.html +++ /dev/null @@ -1,932 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Core.Docs - Core.Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
- - - - - - - - - -
- - - - - - - -

Core.Docs

-

Short: In‑app help and deep‑links.

-

Overview

-

Renders MkDocs content inside your app. Opens specific sections in new windows for contextual help.

-

Setup

-
import (
-  core "github.com/Snider/Core"
-  docs "github.com/Snider/Core/docs"
-)
-
-app := core.New(
-  core.WithService(docs.Register),
-  core.WithServiceLock(),
-)
-
-

Use

-
    -
  • Open docs home in a window: docs.Open()
  • -
  • Open a section: docs.OpenAt("core/display#setup")
  • -
  • Use short, descriptive headings to create stable anchors.
  • -
-

API

-
    -
  • Register(c *core.Core) error
  • -
  • Open() — show docs home
  • -
  • OpenAt(anchor string) — open specific section
  • -
-

Notes

-
    -
  • Docs are built with MkDocs Material and included in the demo app assets.
  • -
  • You are viewing Core.Docs right now, this Website is bundled into the app binary by default.
  • -
- - - - - - - - - - -
-
- - - - - -
- - - -
- -
- - -
- -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/pkg/core/docs/site/core/index.html b/pkg/core/docs/site/core/index.html deleted file mode 100644 index 38c575d..0000000 --- a/pkg/core/docs/site/core/index.html +++ /dev/null @@ -1,901 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Core - Core.Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
- - - - - - - - - -
- - - - - - - -

Core

-

Short: Framework bootstrap and service container.

-

What it is

-

Core wires modules together, provides lifecycle hooks, and locks the service graph for clarity and safety.

-

Setup

-
import "github.com/Snider/Core"
-
-app := core.New(
-    core.WithServiceLock(),
-)
-
-

Use

-
    -
  • Register a module: core.RegisterModule(name, module)
  • -
  • Access a module: core.Mod[T](c, name)
  • -
  • Lock services: core.WithServiceLock()
  • -
-

API

-
    -
  • New(opts ...) *core.Core
  • -
  • RegisterModule(name string, m any) error
  • -
  • Mod[T any](c *core.Core, name ...string) *T
  • -
- - - - - - - - - - -
-
- - - - - -
- - - -
- -
- - -
- -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/pkg/core/docs/site/core/io.html b/pkg/core/docs/site/core/io.html deleted file mode 100644 index 4485a50..0000000 --- a/pkg/core/docs/site/core/io.html +++ /dev/null @@ -1,932 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - Core.IO - Core.Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
- - - - - - - - - -
- - - - - - - -

Core.IO

-

Short: Local/remote filesystem helpers.

-

Overview

-

Abstracts filesystems (local, SFTP, WebDAV) behind a unified API for reading/writing and listing.

-

Setup

-
import (
-  core "github.com/Snider/Core"
-  ioapi "github.com/Snider/Core/filesystem"
-)
-
-app := core.New(
-  core.WithService(ioapi.Register),
-  core.WithServiceLock(),
-)
-
-

Use

-
    -
  • Open a filesystem: fs := ioapi.Local() or ioapi.SFTP(cfg)
  • -
  • Read/write files: fs.Read(path), fs.Write(path, data)
  • -
  • List directories: fs.List(path)
  • -
-

API

-
    -
  • Register(c *core.Core) error
  • -
  • Local() FS
  • -
  • SFTP(cfg Config) (FS, error)
  • -
  • WebDAV(cfg Config) (FS, error)
  • -
-

Notes

-
    -
  • See package pkg/v1/core/filesystem/* for drivers.
  • -
- - - - - - - - - - -
-
- - - - - -
- - - -
- -
- - -
- -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/pkg/core/docs/site/core/workspace.html b/pkg/core/docs/site/core/workspace.html deleted file mode 100644 index 72bbc03..0000000 --- a/pkg/core/docs/site/core/workspace.html +++ /dev/null @@ -1,930 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - Core.Workspace - Core.Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
- - - - - - - - - -
- - - - - - - -

Core.Workspace

-

Short: Projects and paths.

-

Overview

-

Provides a consistent way to resolve app/project directories, temp/cache locations, and user data paths across platforms.

-

Setup

-
import (
-  core "github.com/Snider/Core"
-  workspace "github.com/Snider/Core/workspace"
-)
-
-app := core.New(
-  core.WithService(workspace.Register),
-  core.WithServiceLock(),
-)
-
-

Use

-
    -
  • Get app data dir: ws.DataDir()
  • -
  • Get cache dir: ws.CacheDir()
  • -
  • Resolve project path: ws.Project("my-app")
  • -
-

API

-
    -
  • Register(c *core.Core) error
  • -
  • DataDir() string
  • -
  • CacheDir() string
  • -
  • Project(name string) string
  • -
-

Notes

-
    -
  • Follows OS directory standards (AppData, ~/Library, XDG, etc.).
  • -
- - - - - - - - - - -
-
- - - - - -
- - - -
- -
- - -
- -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/pkg/core/docs/site/images/cross-platform.jpeg b/pkg/core/docs/site/images/cross-platform.jpeg deleted file mode 100644 index 8de2288..0000000 Binary files a/pkg/core/docs/site/images/cross-platform.jpeg and /dev/null differ diff --git a/pkg/core/docs/site/images/decentralised-vpn.jpg b/pkg/core/docs/site/images/decentralised-vpn.jpg deleted file mode 100644 index df1f487..0000000 Binary files a/pkg/core/docs/site/images/decentralised-vpn.jpg and /dev/null differ diff --git a/pkg/core/docs/site/images/favicon.ico b/pkg/core/docs/site/images/favicon.ico deleted file mode 100644 index 8bc8ebb..0000000 Binary files a/pkg/core/docs/site/images/favicon.ico and /dev/null differ diff --git a/pkg/core/docs/site/images/illustration.png b/pkg/core/docs/site/images/illustration.png deleted file mode 100644 index 69f739c..0000000 Binary files a/pkg/core/docs/site/images/illustration.png and /dev/null differ diff --git a/pkg/core/docs/site/images/lethean-logo.png b/pkg/core/docs/site/images/lethean-logo.png deleted file mode 100644 index 591019d..0000000 Binary files a/pkg/core/docs/site/images/lethean-logo.png and /dev/null differ diff --git a/pkg/core/docs/site/images/private-transaction-net.png b/pkg/core/docs/site/images/private-transaction-net.png deleted file mode 100644 index 1eee17a..0000000 Binary files a/pkg/core/docs/site/images/private-transaction-net.png and /dev/null differ diff --git a/pkg/core/docs/site/images/secure-data-storage.jpg b/pkg/core/docs/site/images/secure-data-storage.jpg deleted file mode 100644 index 395a8ae..0000000 Binary files a/pkg/core/docs/site/images/secure-data-storage.jpg and /dev/null differ diff --git a/pkg/core/docs/site/index.html b/pkg/core/docs/site/index.html deleted file mode 100644 index a956691..0000000 --- a/pkg/core/docs/site/index.html +++ /dev/null @@ -1,939 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - Core.Help - Core.Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
- - - - - - - - - -
- - - - - - - -

Overview

-

Core is an opinionated framework for building Go desktop apps with Wails, providing a small set of focused modules you can mix into your app. It ships with sensible defaults and a demo app that doubles as in‑app help.

-
    -
  • Site: https://dappco.re
  • -
  • Repo: https://github.com/Snider/Core
  • -
-

Modules

-
    -
  • Core — framework bootstrap and service container
  • -
  • Core.Config — app and UI state persistence
  • -
  • Core.Crypt — keys, encrypt/decrypt, sign/verify
  • -
  • Core.Display — windows, tray, window state
  • -
  • Core.Docs — in‑app help and deep‑links
  • -
  • Core.IO — local/remote filesystem helpers
  • -
  • Core.Workspace — projects and paths
  • -
-

Quick start

-
package main
-
-import (
-    core "github.com/Snider/Core"
-)
-
-func main() {
-    app := core.New(
-        core.WithServiceLock(),
-    )
-    _ = app // start via Wails in your main package
-}
-
-

Services

-
package demo
-
-import (
-    core "github.com/Snider/Core"
-)
-
-// Register your service
-func Register(c *core.Core) error {
-    return c.RegisterModule("demo", &Demo{core: c})
-}
-
-

Display example

-
package display
-
-import (
-    "context"
-    "github.com/wailsapp/wails/v3/pkg/application"
-)
-
-// Open a window on startup
-func (d *API) ServiceStartup(ctx context.Context, _ application.ServiceOptions) error {
-    d.OpenWindow(
-        OptName("main"),
-        OptHeight(900),
-        OptWidth(1280),
-        OptURL("/"),
-        OptTitle("Core"),
-    )
-    return nil
-}
-
-

See the left nav for detailed pages on each module.

- - - - - - - - - - -
-
- - - - - -
- - - -
- -
- - -
- -
-
-
-
- - - - - - - - - \ No newline at end of file diff --git a/pkg/core/docs/site/search/search_index.js b/pkg/core/docs/site/search/search_index.js deleted file mode 100644 index 193f050..0000000 --- a/pkg/core/docs/site/search/search_index.js +++ /dev/null @@ -1 +0,0 @@ -var __index = {"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"index.html","title":"Overview","text":"

Core is an opinionated framework for building Go desktop apps with Wails, providing a small set of focused modules you can mix into your app. It ships with sensible defaults and a demo app that doubles as in\u2011app help.

"},{"location":"index.html#modules","title":"Modules","text":""},{"location":"index.html#quick-start","title":"Quick start","text":"
package main\nimport (\ncore \"github.com/Snider/Core\"\n)\nfunc main() {\napp := core.New(\ncore.WithServiceLock(),\n)\n_ = app // start via Wails in your main package\n}\n
"},{"location":"index.html#services","title":"Services","text":"
package demo\nimport (\ncore \"github.com/Snider/Core\"\n)\n// Register your service\nfunc Register(c *core.Core) error {\nreturn c.RegisterModule(\"demo\", &Demo{core: c})\n}\n
"},{"location":"index.html#display-example","title":"Display example","text":"
package display\nimport (\n\"context\"\n\"github.com/wailsapp/wails/v3/pkg/application\"\n)\n// Open a window on startup\nfunc (d *API) ServiceStartup(ctx context.Context, _ application.ServiceOptions) error {\nd.OpenWindow(\nOptName(\"main\"),\nOptHeight(900),\nOptWidth(1280),\nOptURL(\"/\"),\nOptTitle(\"Core\"),\n)\nreturn nil\n}\n

See the left nav for detailed pages on each module.

"},{"location":"core/index.html","title":"Core","text":"

Short: Framework bootstrap and service container.

"},{"location":"core/index.html#what-it-is","title":"What it is","text":"

Core wires modules together, provides lifecycle hooks, and locks the service graph for clarity and safety.

"},{"location":"core/index.html#setup","title":"Setup","text":"
import \"github.com/Snider/Core\"\napp := core.New(\ncore.WithServiceLock(),\n)\n
"},{"location":"core/index.html#use","title":"Use","text":""},{"location":"core/index.html#api","title":"API","text":""},{"location":"core/config.html","title":"Core.Config","text":"

Short: App config and UI state persistence.

"},{"location":"core/config.html#overview","title":"Overview","text":"

Stores and retrieves configuration, including window positions/sizes and user prefs.

"},{"location":"core/config.html#setup","title":"Setup","text":"
package main\nimport (\ncore \"github.com/Snider/Core\"\nconfig \"github.com/Snider/Core/config\"\n)\napp := core.New(\ncore.WithService(config.Register),\ncore.WithServiceLock(),\n)\n
"},{"location":"core/config.html#use","title":"Use","text":""},{"location":"core/config.html#api","title":"API","text":""},{"location":"core/crypt.html","title":"Core.Crypt","text":"

Short: Keys, encrypt/decrypt, sign/verify.

"},{"location":"core/crypt.html#overview","title":"Overview","text":"

Simple wrappers around OpenPGP for common crypto tasks.

"},{"location":"core/crypt.html#setup","title":"Setup","text":"
import (\ncore \"github.com/Snider/Core\"\ncrypt \"github.com/Snider/Core/crypt\"\n)\napp := core.New(\ncore.WithService(crypt.Register),\ncore.WithServiceLock(),\n)\n
"},{"location":"core/crypt.html#use","title":"Use","text":""},{"location":"core/crypt.html#api","title":"API","text":""},{"location":"core/crypt.html#notes","title":"Notes","text":""},{"location":"core/display.html","title":"Core.Display","text":"

Short: Windows, tray, and window state.

"},{"location":"core/display.html#overview","title":"Overview","text":"

Manages Wails windows, remembers positions/sizes, exposes JS bindings, and integrates with Core.Config for persistence.

"},{"location":"core/display.html#setup","title":"Setup","text":"
import (\ncore \"github.com/Snider/Core\"\ndisplay \"github.com/Snider/Core/display\"\n)\napp := core.New(\ncore.WithService(display.Register),\ncore.WithServiceLock(),\n)\n
"},{"location":"core/display.html#use","title":"Use","text":""},{"location":"core/display.html#api","title":"API","text":""},{"location":"core/display.html#example","title":"Example","text":"
func (d *API) ServiceStartup(ctx context.Context, _ application.ServiceOptions) error {\nd.OpenWindow(\nOptName(\"main\"), OptWidth(1280), OptHeight(900), OptURL(\"/\"), OptTitle(\"Core\"),\n)\nreturn nil\n}\n
"},{"location":"core/docs.html","title":"Core.Docs","text":"

Short: In\u2011app help and deep\u2011links.

"},{"location":"core/docs.html#overview","title":"Overview","text":"

Renders MkDocs content inside your app. Opens specific sections in new windows for contextual help.

"},{"location":"core/docs.html#setup","title":"Setup","text":"
import (\ncore \"github.com/Snider/Core\"\ndocs \"github.com/Snider/Core/docs\"\n)\napp := core.New(\ncore.WithService(docs.Register),\ncore.WithServiceLock(),\n)\n
"},{"location":"core/docs.html#use","title":"Use","text":""},{"location":"core/docs.html#api","title":"API","text":""},{"location":"core/docs.html#notes","title":"Notes","text":""},{"location":"core/io.html","title":"Core.IO","text":"

Short: Local/remote filesystem helpers.

"},{"location":"core/io.html#overview","title":"Overview","text":"

Abstracts filesystems (local, SFTP, WebDAV) behind a unified API for reading/writing and listing.

"},{"location":"core/io.html#setup","title":"Setup","text":"
import (\ncore \"github.com/Snider/Core\"\nioapi \"github.com/Snider/Core/filesystem\"\n)\napp := core.New(\ncore.WithService(ioapi.Register),\ncore.WithServiceLock(),\n)\n
"},{"location":"core/io.html#use","title":"Use","text":""},{"location":"core/io.html#api","title":"API","text":""},{"location":"core/io.html#notes","title":"Notes","text":""},{"location":"core/workspace.html","title":"Core.Workspace","text":"

Short: Projects and paths.

"},{"location":"core/workspace.html#overview","title":"Overview","text":"

Provides a consistent way to resolve app/project directories, temp/cache locations, and user data paths across platforms.

"},{"location":"core/workspace.html#setup","title":"Setup","text":"
import (\ncore \"github.com/Snider/Core\"\nworkspace \"github.com/Snider/Core/workspace\"\n)\napp := core.New(\ncore.WithService(workspace.Register),\ncore.WithServiceLock(),\n)\n
"},{"location":"core/workspace.html#use","title":"Use","text":""},{"location":"core/workspace.html#api","title":"API","text":""},{"location":"core/workspace.html#notes","title":"Notes","text":""}]} \ No newline at end of file diff --git a/pkg/core/docs/site/search/search_index.json b/pkg/core/docs/site/search/search_index.json deleted file mode 100644 index 323cc07..0000000 --- a/pkg/core/docs/site/search/search_index.json +++ /dev/null @@ -1 +0,0 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"index.html","title":"Overview","text":"

Core is an opinionated framework for building Go desktop apps with Wails, providing a small set of focused modules you can mix into your app. It ships with sensible defaults and a demo app that doubles as in\u2011app help.

"},{"location":"index.html#modules","title":"Modules","text":""},{"location":"index.html#quick-start","title":"Quick start","text":"
package main\nimport (\ncore \"github.com/Snider/Core\"\n)\nfunc main() {\napp := core.New(\ncore.WithServiceLock(),\n)\n_ = app // start via Wails in your main package\n}\n
"},{"location":"index.html#services","title":"Services","text":"
package demo\nimport (\ncore \"github.com/Snider/Core\"\n)\n// Register your service\nfunc Register(c *core.Core) error {\nreturn c.RegisterModule(\"demo\", &Demo{core: c})\n}\n
"},{"location":"index.html#display-example","title":"Display example","text":"
package display\nimport (\n\"context\"\n\"github.com/wailsapp/wails/v3/pkg/application\"\n)\n// Open a window on startup\nfunc (d *API) ServiceStartup(ctx context.Context, _ application.ServiceOptions) error {\nd.OpenWindow(\nOptName(\"main\"),\nOptHeight(900),\nOptWidth(1280),\nOptURL(\"/\"),\nOptTitle(\"Core\"),\n)\nreturn nil\n}\n

See the left nav for detailed pages on each module.

"},{"location":"core/index.html","title":"Core","text":"

Short: Framework bootstrap and service container.

"},{"location":"core/index.html#what-it-is","title":"What it is","text":"

Core wires modules together, provides lifecycle hooks, and locks the service graph for clarity and safety.

"},{"location":"core/index.html#setup","title":"Setup","text":"
import \"github.com/Snider/Core\"\napp := core.New(\ncore.WithServiceLock(),\n)\n
"},{"location":"core/index.html#use","title":"Use","text":""},{"location":"core/index.html#api","title":"API","text":""},{"location":"core/config.html","title":"Core.Config","text":"

Short: App config and UI state persistence.

"},{"location":"core/config.html#overview","title":"Overview","text":"

Stores and retrieves configuration, including window positions/sizes and user prefs.

"},{"location":"core/config.html#setup","title":"Setup","text":"
package main\nimport (\ncore \"github.com/Snider/Core\"\nconfig \"github.com/Snider/Core/config\"\n)\napp := core.New(\ncore.WithService(config.Register),\ncore.WithServiceLock(),\n)\n
"},{"location":"core/config.html#use","title":"Use","text":""},{"location":"core/config.html#api","title":"API","text":""},{"location":"core/crypt.html","title":"Core.Crypt","text":"

Short: Keys, encrypt/decrypt, sign/verify.

"},{"location":"core/crypt.html#overview","title":"Overview","text":"

Simple wrappers around OpenPGP for common crypto tasks.

"},{"location":"core/crypt.html#setup","title":"Setup","text":"
import (\ncore \"github.com/Snider/Core\"\ncrypt \"github.com/Snider/Core/crypt\"\n)\napp := core.New(\ncore.WithService(crypt.Register),\ncore.WithServiceLock(),\n)\n
"},{"location":"core/crypt.html#use","title":"Use","text":""},{"location":"core/crypt.html#api","title":"API","text":""},{"location":"core/crypt.html#notes","title":"Notes","text":""},{"location":"core/display.html","title":"Core.Display","text":"

Short: Windows, tray, and window state.

"},{"location":"core/display.html#overview","title":"Overview","text":"

Manages Wails windows, remembers positions/sizes, exposes JS bindings, and integrates with Core.Config for persistence.

"},{"location":"core/display.html#setup","title":"Setup","text":"
import (\ncore \"github.com/Snider/Core\"\ndisplay \"github.com/Snider/Core/display\"\n)\napp := core.New(\ncore.WithService(display.Register),\ncore.WithServiceLock(),\n)\n
"},{"location":"core/display.html#use","title":"Use","text":""},{"location":"core/display.html#api","title":"API","text":""},{"location":"core/display.html#example","title":"Example","text":"
func (d *API) ServiceStartup(ctx context.Context, _ application.ServiceOptions) error {\nd.OpenWindow(\nOptName(\"main\"), OptWidth(1280), OptHeight(900), OptURL(\"/\"), OptTitle(\"Core\"),\n)\nreturn nil\n}\n
"},{"location":"core/docs.html","title":"Core.Docs","text":"

Short: In\u2011app help and deep\u2011links.

"},{"location":"core/docs.html#overview","title":"Overview","text":"

Renders MkDocs content inside your app. Opens specific sections in new windows for contextual help.

"},{"location":"core/docs.html#setup","title":"Setup","text":"
import (\ncore \"github.com/Snider/Core\"\ndocs \"github.com/Snider/Core/docs\"\n)\napp := core.New(\ncore.WithService(docs.Register),\ncore.WithServiceLock(),\n)\n
"},{"location":"core/docs.html#use","title":"Use","text":""},{"location":"core/docs.html#api","title":"API","text":""},{"location":"core/docs.html#notes","title":"Notes","text":""},{"location":"core/io.html","title":"Core.IO","text":"

Short: Local/remote filesystem helpers.

"},{"location":"core/io.html#overview","title":"Overview","text":"

Abstracts filesystems (local, SFTP, WebDAV) behind a unified API for reading/writing and listing.

"},{"location":"core/io.html#setup","title":"Setup","text":"
import (\ncore \"github.com/Snider/Core\"\nioapi \"github.com/Snider/Core/filesystem\"\n)\napp := core.New(\ncore.WithService(ioapi.Register),\ncore.WithServiceLock(),\n)\n
"},{"location":"core/io.html#use","title":"Use","text":""},{"location":"core/io.html#api","title":"API","text":""},{"location":"core/io.html#notes","title":"Notes","text":""},{"location":"core/workspace.html","title":"Core.Workspace","text":"

Short: Projects and paths.

"},{"location":"core/workspace.html#overview","title":"Overview","text":"

Provides a consistent way to resolve app/project directories, temp/cache locations, and user data paths across platforms.

"},{"location":"core/workspace.html#setup","title":"Setup","text":"
import (\ncore \"github.com/Snider/Core\"\nworkspace \"github.com/Snider/Core/workspace\"\n)\napp := core.New(\ncore.WithService(workspace.Register),\ncore.WithServiceLock(),\n)\n
"},{"location":"core/workspace.html#use","title":"Use","text":""},{"location":"core/workspace.html#api","title":"API","text":""},{"location":"core/workspace.html#notes","title":"Notes","text":""}]} \ No newline at end of file diff --git a/pkg/core/docs/site/sitemap.xml b/pkg/core/docs/site/sitemap.xml deleted file mode 100644 index a063358..0000000 --- a/pkg/core/docs/site/sitemap.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - https://dappco.re/index.html - 2025-10-25 - - - https://dappco.re/core/index.html - 2025-10-25 - - - https://dappco.re/core/config.html - 2025-10-25 - - - https://dappco.re/core/crypt.html - 2025-10-25 - - - https://dappco.re/core/display.html - 2025-10-25 - - - https://dappco.re/core/docs.html - 2025-10-25 - - - https://dappco.re/core/io.html - 2025-10-25 - - - https://dappco.re/core/workspace.html - 2025-10-25 - - \ No newline at end of file diff --git a/pkg/core/docs/site/sitemap.xml.gz b/pkg/core/docs/site/sitemap.xml.gz deleted file mode 100644 index c4e06d9..0000000 Binary files a/pkg/core/docs/site/sitemap.xml.gz and /dev/null differ diff --git a/pkg/core/docs/site/stylesheets/extra.css b/pkg/core/docs/site/stylesheets/extra.css deleted file mode 100644 index 8a89327..0000000 --- a/pkg/core/docs/site/stylesheets/extra.css +++ /dev/null @@ -1,367 +0,0 @@ -[data-md-color-scheme="lethean"] { - --md-primary-fg-color: #0F131C; -} - -.hero-section { - background: linear-gradient(135deg, #0F131C 0%, #1a237e 100%); - color: white; - padding: 4rem 2rem; - text-align: center; - margin-bottom: 3rem; -} - -.hero-content { - max-width: 800px; - margin: 0 auto; -} - -.hero-content h1 { - font-size: 2.5rem; - margin-bottom: 1rem; - color: white; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); -} - -.hero-subtitle { - font-size: 1.25rem; - margin-bottom: 2rem; - opacity: 0.9; -} - -.hero-badges { - margin-bottom: 2rem; -} - -.badge { - background: rgba(255, 255, 255, 0.1); - padding: 0.5rem 1rem; - border-radius: 20px; - margin: 0 0.5rem; - font-size: 0.9rem; -} - -.cta-button { - display: inline-block; - background: #4A90E2; - color: white; - padding: 0.8rem 2rem; - border-radius: 4px; - text-decoration: none; - font-weight: 500; - transition: all 0.3s; -} - -.cta-button:hover { - background: #357ABD; - color: white; - transform: translateY(-2px); -} - -.cta-button.secondary { - background: transparent; - border: 2px solid #4A90E2; - color: #4A90E2; -} - -.features-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - gap: 0.2rem; - padding: 0.2rem; - margin-bottom: 3rem; -} - -.feature-card { - background: white; - border-radius: 8px; - padding: 1.0rem; - border: 2px solid #e2e8f0; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - transition: all 0.3s; -} - -[data-md-color-scheme="slate"] .feature-card { - background: #2d3748; - border-color: #4a5568; - color: #e2e8f0; -} - -.feature-card:hover { - transform: translateY(-5px); - box-shadow: 0 6px 8px rgba(0, 0, 0, 0.15); -} - -.feature-card img { - width: 100%; - height: 150px; - object-fit: cover; - border-radius: 4px; - margin-bottom: 1rem; -} - -.feature-card h3 { - margin: 1rem 0; - color: #0F131C; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); -} - -[data-md-color-scheme="slate"] .feature-card h3 { - color: #e2e8f0; -} - -.get-started { - color: #4A90E2; - text-decoration: none; - font-weight: 500; -} - -.benefits-section { - background: #f5f5f5; - padding: 0.4rem 0.2rem; - text-align: center; - margin-bottom: 3rem; -} - -.benefits-section h2 { - font-size: 1.5rem; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 1px; - margin-bottom: 0.5rem; - margin-top: 0.8rem; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); -} - -[data-md-color-scheme="slate"] .benefits-section { - background: #1a202c; - color: #e2e8f0; -} - -.benefits-grid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); - gap: 0.2rem; - padding: 0.2rem; - margin: 0.2rem auto; -} - -.benefit-card { - background: white; - padding: 0.5rem; - border-radius: 8px; - border: 2px solid #e2e8f0; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - text-align: left; -} - -[data-md-color-scheme="slate"] .benefit-card { - background: #2d3748; - border-color: #4a5568; - color: #e2e8f0; -} - -.roadmap-section { - padding: 0.4rem 0.2rem; - max-width: 1200px; - margin: 0 auto; -} - -.timeline { - position: relative; - display: grid; - grid-template-columns: repeat(2, 1fr); - gap: 2rem; - margin: 2rem 0; -} - -.timeline-item { - background: white; - padding: 1.5rem; - border-radius: 8px; - border: 2px solid #e2e8f0; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - position: relative; - transition: all 0.3s; -} - -.timeline-item.completed { - grid-column: span 2; -} - -[data-md-color-scheme="slate"] .timeline-item { - background: #2d3748; - border-color: #4a5568; - color: #e2e8f0; -} - -.timeline-item:hover { - transform: translateY(-2px); - box-shadow: 0 6px 8px rgba(0, 0, 0, 0.15); -} - -.timeline-marker { - width: 20px; - height: 20px; - border-radius: 50%; - position: absolute; - top: -10px; - left: 50%; - transform: translateX(-50%); -} - -.timeline-item.planning .timeline-marker { - background: #718096; -} - -.timeline-item.in-progress .timeline-marker { - background: #4A90E2; -} - -.timeline-item.completed .timeline-marker { - background: #48BB78; -} - -.timeline-item ul { - list-style: none; - padding: 0; -} - -.timeline-item li { - margin: 0.5rem 0; - padding-left: 24px; - position: relative; -} - -.timeline-item li::before { - content: ""; - width: 12px; - height: 12px; - border-radius: 50%; - position: absolute; - left: 0; - top: 50%; - transform: translateY(-50%); -} - -.timeline-item li.planned::before { - background: #718096; -} - -.timeline-item li.active::before { - background: #4A90E2; -} - -.timeline-item li.completed::before { - background: #48BB78; -} - -.timeline-item li ul { - margin-top: 0.5rem; - margin-left: 1rem; -} - -.timeline-item li ul li { - font-size: 0.9rem; - margin: 0.25rem 0; -} - -.timeline-item li ul li::before { - width: 8px; - height: 8px; - background: #a0aec0; -} - -.timeline-item li ul li a { - color: #4A90E2; - text-decoration: none; - font-weight: 500; -} - -.timeline-item li ul li a:hover { - color: #357ABD; - text-decoration: underline; -} - -[data-md-color-scheme="slate"] .timeline-item li ul li a { - color: #63b3ed; -} - -[data-md-color-scheme="slate"] .timeline-item li ul li a:hover { - color: #90cdf4; -} - -.date { - font-size: 0.8rem; - color: #718096; - margin-left: 0.5rem; -} - -[data-md-color-scheme="slate"] .date { - color: #a0aec0; -} - -.cta-section { - background: #0F131C; - color: white; - padding: 4rem 2rem; - text-align: center; - margin-bottom: 3rem; -} - -.cta-buttons { - display: flex; - gap: 1rem; - justify-content: center; - margin-top: 2rem; -} - -.community-section { - padding: 4rem 2rem; - text-align: center; -} - -.community-links { - display: flex; - gap: 2rem; - justify-content: center; - margin-top: 2rem; -} - -.community-link { - color: #4A90E2; - text-decoration: none; - font-weight: 500; - transition: all 0.3s; -} - -.community-link:hover { - color: #357ABD; - transform: translateY(-2px); -} - -@media (max-width: 768px) { - .hero-content h1 { - font-size: 2rem; - } - - .timeline { - grid-template-columns: 1fr; - } - - .timeline-item.completed { - grid-column: auto; - } - - .features-grid { - grid-template-columns: 1fr; - } - - .cta-buttons { - flex-direction: column; - } - - .community-links { - flex-direction: column; - gap: 1rem; - } -} \ No newline at end of file