jssm 5.148.0 → 5.148.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -18,10 +18,10 @@ Please edit the file it's derived from, instead: `./src/md/readme_base.md`
18
18
 
19
19
 
20
20
 
21
- * Generated for version 5.148.0 at 6/27/2026, 11:13:49 PM
21
+ * Generated for version 5.148.2 at 6/28/2026, 1:26:54 AM
22
22
 
23
23
  -->
24
- # jssm 5.148.0
24
+ # jssm 5.148.2
25
25
 
26
26
  [**Try the live editor**](https://stonecypher.github.io/jssm-viz-demo/graph_explorer.html) ·
27
27
  [Documentation](https://stonecypher.github.io/jssm/docs/) ·
@@ -312,7 +312,7 @@ That decision shows up everywhere downstream:
312
312
  or run `npm run benny` against your own machine.
313
313
 
314
314
  - **More thoroughly tested than any other JavaScript state-machine
315
- library.** 7,682 tests at 100.0% line coverage
315
+ library.** 7,683 tests at 100.0% line coverage
316
316
  ([report](https://coveralls.io/github/StoneCypher/jssm)), plus
317
317
  fuzz testing via `fast-check`, with parser test data across ten natural
318
318
  languages and Emoji.
@@ -445,9 +445,9 @@ If your contribution is missing here, please open an issue.
445
445
 
446
446
  <br/>
447
447
 
448
- ***7,682 tests***, run 82,328 times.
448
+ ***7,683 tests***, run 82,329 times.
449
449
 
450
- - 6,928 specs with 100.0% coverage
450
+ - 6,929 specs with 100.0% coverage
451
451
  - 754 fuzz tests with 59.4% coverage
452
452
  - 8,790 TypeScript lines - 0.9 tests per line, 9.4 generated tests per line
453
453
 
@@ -8,7 +8,7 @@
8
8
  "declarations": [
9
9
  {
10
10
  "kind": "class",
11
- "description": "`<fsl-actions>` — interactive controls derived from a parent `<fsl-instance>`'s\nmachine. Renders a button for every currently-legal named **action** and, split\ninto three groups, every reachable transition target by edge kind: **main**\n(`=>`) first, plain **transitions** (`->`) next, and **forced** (`~>`) last.\nLegal targets fire with `transition`, forced-only ones with `force_transition`.\nRe-derives on the host's transition / rebuild events; only firable controls\nappear, and each group is omitted when empty, so a self-loop-only state shows\njust its actions and a terminal state shows `no actions available`. Standalone\n(no host ancestor) renders empty.",
11
+ "description": "`<fsl-actions>` — interactive controls derived from a parent `<fsl-instance>`'s\r\nmachine. Renders a button for every currently-legal named **action** and, split\r\ninto three groups, every reachable transition target by edge kind: **main**\r\n(`=>`) first, plain **transitions** (`->`) next, and **forced** (`~>`) last.\r\nLegal targets fire with `transition`, forced-only ones with `force_transition`.\r\nRe-derives on the host's transition / rebuild events; only firable controls\r\nappear, and each group is omitted when empty, so a self-loop-only state shows\r\njust its actions and a terminal state shows `no actions available`. Standalone\r\n(no host ancestor) renders empty.",
12
12
  "name": "FslActions",
13
13
  "cssParts": [
14
14
  {
@@ -353,11 +353,11 @@
353
353
  "description": "A JSON string (typically `JSON.stringify(value, null, 2)`)."
354
354
  }
355
355
  ],
356
- "description": "Split a pretty-printed JSON string into classified tokens for syntax\nhighlighting. A quoted run is a `key` when the next non-space character is\n`:`, otherwise a `string`; `true`/`false` are `bool`, `null` is `null`,\nnumbers are `number`, and everything between (braces, commas, whitespace) is\n`plain`. Driven by the text, not a JSON parse, so it never throws."
356
+ "description": "Split a pretty-printed JSON string into classified tokens for syntax\r\nhighlighting. A quoted run is a `key` when the next non-space character is\r\n`:`, otherwise a `string`; `true`/`false` are `bool`, `null` is `null`,\r\nnumbers are `number`, and everything between (braces, commas, whitespace) is\r\n`plain`. Driven by the text, not a JSON parse, so it never throws."
357
357
  },
358
358
  {
359
359
  "kind": "class",
360
- "description": "`<fsl-data-inspector>` — a syntax-highlighted view of a parent\n`<fsl-instance>`'s extended-state data. Re-reads `host.machine.data()` on the\nhost's transition / data-change / rebuild DOM events. The panel is bounded and\nscrolls internally (a self-contained vertical column). Renders `no data` when\nthe machine carries none; standalone (no host) renders empty.",
360
+ "description": "`<fsl-data-inspector>` — a syntax-highlighted view of a parent\r\n`<fsl-instance>`'s extended-state data. Re-reads `host.machine.data()` on the\r\nhost's transition / data-change / rebuild DOM events. The panel is bounded and\r\nscrolls internally (a self-contained vertical column). Renders `no data` when\r\nthe machine carries none; standalone (no host) renders empty.",
361
361
  "name": "FslDataInspector",
362
362
  "cssParts": [
363
363
  {
@@ -418,7 +418,7 @@
418
418
  "declarations": [
419
419
  {
420
420
  "kind": "class",
421
- "description": "`<fsl-editor>` — a CodeMirror-based FSL editor web component.\n\nBatteries-included: FSL highlighting (`jssm/cm6`), linting, a semantic\noverlay (color chips / state & enum marks), and context-aware completion —\neach toggleable via a `no-*` attribute. Light/dark via the reflected `theme`\nattribute (which also drives the `--fsl-*` token defaults). White-labeled\nthrough the shared appearance contract. Emits `change` on user edits.",
421
+ "description": "`<fsl-editor>` — a CodeMirror-based FSL editor web component.\r\n\r\nBatteries-included: FSL highlighting (`jssm/cm6`), linting, a semantic\r\noverlay (color chips / state & enum marks), and context-aware completion —\r\neach toggleable via a `no-*` attribute. Light/dark via the reflected `theme`\r\nattribute (which also drives the `--fsl-*` token defaults). White-labeled\r\nthrough the shared appearance contract. Emits `change` on user edits.",
422
422
  "name": "FslEditor",
423
423
  "cssParts": [
424
424
  {
@@ -767,7 +767,7 @@
767
767
  "declarations": [
768
768
  {
769
769
  "kind": "class",
770
- "description": "`<fsl-export>` — export buttons for a parent `<fsl-instance>`. Each produces a\nstring from the host's machine and fires `fsl-export` with `{ format,\ncontent }`; the embedder decides what to do with it (copy, download, show).\nFormats: Graphviz `dot` (via `machine_to_dot`), `json` (the machine's\n`serialize()`), and `fsl` (the source). Standalone is inert.",
770
+ "description": "`<fsl-export>` — export buttons for a parent `<fsl-instance>`. Each produces a\r\nstring from the host's machine and fires `fsl-export` with `{ format,\r\ncontent }`; the embedder decides what to do with it (copy, download, show).\r\nFormats: Graphviz `dot` (via `machine_to_dot`), `json` (the machine's\r\n`serialize()`), and `fsl` (the source). Standalone is inert.",
771
771
  "name": "FslExport",
772
772
  "cssParts": [
773
773
  {
@@ -837,7 +837,7 @@
837
837
  "declarations": [
838
838
  {
839
839
  "kind": "class",
840
- "description": "`<fsl-footer>` — a status bar for a parent `<fsl-instance>`.\n\nReflects the host's current state, legal-action count, and\nterminal/complete status by observing the host's reflected attributes\n(`current-state`, `legal-actions`, `terminal`, `complete`) — so it tracks\ntransitions *and* survives a live machine rebuild (#1387) without a machine\nsubscription. A default slot carries embedder status (line/column, parse\nstate, …). Standalone (no `<fsl-instance>` ancestor) it renders just the slot.",
840
+ "description": "`<fsl-footer>` — a status bar for a parent `<fsl-instance>`.\r\n\r\nReflects the host's current state, legal-action count, and\r\nterminal/complete status by observing the host's reflected attributes\r\n(`current-state`, `legal-actions`, `terminal`, `complete`) — so it tracks\r\ntransitions *and* survives a live machine rebuild (#1387) without a machine\r\nsubscription. A default slot carries embedder status (line/column, parse\r\nstate, …). Standalone (no `<fsl-instance>` ancestor) it renders just the slot.",
841
841
  "name": "FslFooter",
842
842
  "cssParts": [
843
843
  {
@@ -923,7 +923,7 @@
923
923
  "declarations": [
924
924
  {
925
925
  "kind": "class",
926
- "description": "`<fsl-help>` — a documentation drawer shell: a titled, scrollable panel with\na close button and a default slot for content (typically foldable\n`<details>` sections). Presentational and self-contained — it owns no machine\nbinding. The reflected `open` attribute drives visibility, so embedders can\nanimate it (e.g. a width transition on the host) purely from CSS.",
926
+ "description": "`<fsl-help>` — a documentation drawer shell: a titled, scrollable panel with\r\na close button and a default slot for content (typically foldable\r\n`<details>` sections). Presentational and self-contained — it owns no machine\r\nbinding. The reflected `open` attribute drives visibility, so embedders can\r\nanimate it (e.g. a width transition on the host) purely from CSS.",
927
927
  "name": "FslHelp",
928
928
  "cssParts": [
929
929
  {
@@ -1032,7 +1032,7 @@
1032
1032
  "declarations": [
1033
1033
  {
1034
1034
  "kind": "class",
1035
- "description": "`<fsl-history>` — the visited-state timeline for a parent `<fsl-instance>`.\n\nListens to the host's `fsl-transition` DOM events (re-emitted once per\ntransition, #639) and records the host's reflected `current-state`, so it\ncaptures every transition and survives a live machine rebuild without a\nmachine subscription. Standalone (no host ancestor) renders empty.",
1035
+ "description": "`<fsl-history>` — the visited-state timeline for a parent `<fsl-instance>`.\r\n\r\nListens to the host's `fsl-transition` DOM events (re-emitted once per\r\ntransition, #639) and records the host's reflected `current-state`, so it\r\ncaptures every transition and survives a live machine rebuild without a\r\nmachine subscription. Standalone (no host ancestor) renders empty.",
1036
1036
  "name": "FslHistory",
1037
1037
  "cssParts": [
1038
1038
  {
@@ -1085,7 +1085,7 @@
1085
1085
  "declarations": [
1086
1086
  {
1087
1087
  "kind": "class",
1088
- "description": "`<fsl-hook-log>` — a running log of a parent `<fsl-instance>`'s machine\nevents, listening to the host's re-emitted `fsl-*` DOM events (#639). Keeps\nthe most recent MAX_ENTRIES. Standalone (no host ancestor) is empty.",
1088
+ "description": "`<fsl-hook-log>` — a running log of a parent `<fsl-instance>`'s machine\r\nevents, listening to the host's re-emitted `fsl-*` DOM events (#639). Keeps\r\nthe most recent MAX_ENTRIES. Standalone (no host ancestor) is empty.",
1089
1089
  "name": "FslHookLog",
1090
1090
  "cssParts": [
1091
1091
  {
@@ -2546,7 +2546,7 @@
2546
2546
  "declarations": [
2547
2547
  {
2548
2548
  "kind": "class",
2549
- "description": "`<fsl-simulation>` — a random-walk driver for a parent `<fsl-instance>`.\n\n`Step` fires one uniformly-random legal action; `Play` auto-steps every\nFslSimulation.interval ms and stops automatically when the machine\nreaches a terminal state (no legal actions). Standalone (no host ancestor)\nthe controls are disabled.",
2549
+ "description": "`<fsl-simulation>` — a random-walk driver for a parent `<fsl-instance>`.\r\n\r\n`Step` fires one uniformly-random legal action; `Play` auto-steps every\r\nFslSimulation.interval ms and stops automatically when the machine\r\nreaches a terminal state (no legal actions). Standalone (no host ancestor)\r\nthe controls are disabled.",
2550
2550
  "name": "FslSimulation",
2551
2551
  "cssParts": [
2552
2552
  {
@@ -2673,7 +2673,7 @@
2673
2673
  "text": "ThemeRegistry"
2674
2674
  },
2675
2675
  "default": "{ Default: { light: { surface: '#ffffff', text: '#222222', accent: '#5b9dff', border: '#e5e5e5', muted: '#9aa0a6', 'json-key': '#5b3da8', 'json-string': '#2e7d32', 'json-number': '#b8860b', 'json-atom': '#c2185b', }, dark: { surface: '#1e1e22', text: '#d6d6d6', accent: '#82aaff', border: '#2a2a2e', muted: '#5a5f66', 'json-key': '#82aaff', 'json-string': '#c3e88d', 'json-number': '#f78c6c', 'json-atom': '#c792ea', }, }, Solarized: { light: { surface: '#fdf6e3', text: '#657b83', accent: '#268bd2', border: '#eee8d5', muted: '#93a1a1', 'json-key': '#6c71c4', 'json-string': '#859900', 'json-number': '#b58900', 'json-atom': '#d33682', }, dark: { surface: '#002b36', text: '#839496', accent: '#268bd2', border: '#073642', muted: '#586e75', 'json-key': '#6c71c4', 'json-string': '#859900', 'json-number': '#b58900', 'json-atom': '#d33682', }, }, }",
2676
- "description": "The built-in themes: `Default` (the suite's house palette) and `Solarized`\n(Ethan Schoonover's palette). Consumers can extend the host's `themes`\nregistry with their own; every entry shows up in the toolbar's theme list."
2676
+ "description": "The built-in themes: `Default` (the suite's house palette) and `Solarized`\r\n(Ethan Schoonover's palette). Consumers can extend the host's `themes`\r\nregistry with their own; every entry shows up in the toolbar's theme list."
2677
2677
  },
2678
2678
  {
2679
2679
  "kind": "function",
@@ -2706,7 +2706,7 @@
2706
2706
  "description": "`light` or `dark`."
2707
2707
  }
2708
2708
  ],
2709
- "description": "Resolve a `(registry, theme name, variant)` triple to a concrete palette,\nfalling back to the built-in `Default` theme when the name is unknown."
2709
+ "description": "Resolve a `(registry, theme name, variant)` triple to a concrete palette,\r\nfalling back to the built-in `Default` theme when the name is unknown."
2710
2710
  },
2711
2711
  {
2712
2712
  "kind": "function",
@@ -2732,7 +2732,7 @@
2732
2732
  "description": "Whether the OS prefers a dark color scheme."
2733
2733
  }
2734
2734
  ],
2735
- "description": "Resolve a theme mode to a concrete `light`/`dark`. `system` consults the OS\npreference; `light`/`dark` are returned as-is."
2735
+ "description": "Resolve a theme mode to a concrete `light`/`dark`. `system` consults the OS\r\npreference; `light`/`dark` are returned as-is."
2736
2736
  },
2737
2737
  {
2738
2738
  "kind": "function",
@@ -2751,7 +2751,7 @@
2751
2751
  "description": "The resolved palette."
2752
2752
  }
2753
2753
  ],
2754
- "description": "Map a palette to its `--fsl-color-*` custom-property entries, ready to set on\nan element's style."
2754
+ "description": "Map a palette to its `--fsl-color-*` custom-property entries, ready to set on\r\nan element's style."
2755
2755
  },
2756
2756
  {
2757
2757
  "kind": "function",
@@ -2817,7 +2817,7 @@
2817
2817
  "text": "CSSResult"
2818
2818
  },
2819
2819
  "default": "css` :host { --_fsl-surface: var(--fsl-color-surface, #ffffff); --_fsl-text: var(--fsl-color-text, #222222); --_fsl-accent: var(--fsl-color-accent, #5b9dff); --_fsl-border: var(--fsl-color-border, #e5e5e5); --_fsl-muted: var(--fsl-color-muted, #9aa0a6); --_fsl-font: var(--fsl-font, system-ui, -apple-system, \"Segoe UI\", sans-serif); --_fsl-font-mono: var(--fsl-font-mono, ui-monospace, Consolas, monospace); --_fsl-radius: var(--fsl-radius, 6px); --_fsl-space-1: var(--fsl-space-1, 4px); --_fsl-space-2: var(--fsl-space-2, 8px); --_fsl-space-3: var(--fsl-space-3, 12px); --_fsl-space-4: var(--fsl-space-4, 16px); } :host([theme=\"dark\"]) { --_fsl-surface: var(--fsl-color-surface, #1e1e22); --_fsl-text: var(--fsl-color-text, #d6d6d6); --_fsl-accent: var(--fsl-color-accent, #82aaff); --_fsl-border: var(--fsl-color-border, #2a2a2e); --_fsl-muted: var(--fsl-color-muted, #5a5f66); } `",
2820
- "description": "Shared FSL appearance contract — the `--fsl-*` design-token vocabulary.\n\nComponents include this in `static styles` and consume the **private**\n`--_fsl-*` vars, which resolve: embedder's public `--fsl-*` token →\n`[theme=\"dark\"]` default → built-in light fallback. White-label by setting\n`--fsl-*` on any ancestor (custom properties inherit through shadow DOM);\nflip the built-in default with the host's `theme=\"dark\"` attribute.\n\nCompanion conventions (declared per-component): expose structural elements as\n`::part(...)` (e.g. `part=\"toolbar\"`, `\"gutter\"`, `\"editor\"`) and forward\nchild parts with `exportparts`; chrome components carry brand slots\n(`<slot name=\"brand\">` / `\"logo\">`)."
2820
+ "description": "Shared FSL appearance contract — the `--fsl-*` design-token vocabulary.\r\n\r\nComponents include this in `static styles` and consume the **private**\r\n`--_fsl-*` vars, which resolve: embedder's public `--fsl-*` token →\r\n`[theme=\"dark\"]` default → built-in light fallback. White-label by setting\r\n`--fsl-*` on any ancestor (custom properties inherit through shadow DOM);\r\nflip the built-in default with the host's `theme=\"dark\"` attribute.\r\n\r\nCompanion conventions (declared per-component): expose structural elements as\r\n`::part(...)` (e.g. `part=\"toolbar\"`, `\"gutter\"`, `\"editor\"`) and forward\r\nchild parts with `exportparts`; chrome components carry brand slots\r\n(`<slot name=\"brand\">` / `\"logo\">`)."
2821
2821
  }
2822
2822
  ],
2823
2823
  "exports": [
@@ -2837,7 +2837,7 @@
2837
2837
  "declarations": [
2838
2838
  {
2839
2839
  "kind": "class",
2840
- "description": "`<fsl-toolbar>` — a control bar for a parent `<fsl-instance>`. A light/dark\ntheme toggle on the left; on the right, an icon toggle to show/hide each\npanel present in the host (renderer, code, history, …) plus a View menu of\nthe layout set (its button shows the current layout's icon). Standalone (no\nhost) the panel toggles disappear. A trailing slot carries extra buttons.",
2840
+ "description": "`<fsl-toolbar>` — a control bar for a parent `<fsl-instance>`. A light/dark\r\ntheme toggle on the left; on the right, an icon toggle to show/hide each\r\npanel present in the host (renderer, code, history, …) plus a View menu of\r\nthe layout set (its button shows the current layout's icon). Standalone (no\r\nhost) the panel toggles disappear. A trailing slot carries extra buttons.",
2841
2841
  "name": "FslToolbar",
2842
2842
  "cssParts": [
2843
2843
  {
@@ -2878,7 +2878,7 @@
2878
2878
  "text": "string"
2879
2879
  },
2880
2880
  "default": "''",
2881
- "description": "The last directory an export was saved to this session (its final path\nsegment). When non-empty, the Export menu offers a `to <name>` destination.\nThe embedder sets this after fulfilling a `pick` export."
2881
+ "description": "The last directory an export was saved to this session (its final path\r\nsegment). When non-empty, the Export menu offers a `to <name>` destination.\r\nThe embedder sets this after fulfilling a `pick` export."
2882
2882
  },
2883
2883
  {
2884
2884
  "kind": "field",
@@ -2916,7 +2916,7 @@
2916
2916
  }
2917
2917
  }
2918
2918
  ],
2919
- "description": "Set the theme mode (System/Light/Dark). The host applies the palette + drives\nthe editor; the menu stays open so a theme can be picked in the same trip."
2919
+ "description": "Set the theme mode (System/Light/Dark). The host applies the palette + drives\r\nthe editor; the menu stays open so a theme can be picked in the same trip."
2920
2920
  },
2921
2921
  {
2922
2922
  "kind": "method",
@@ -2935,7 +2935,7 @@
2935
2935
  }
2936
2936
  }
2937
2937
  ],
2938
- "description": "Select a named theme from the host's registry. The theme-name buttons only\nrender when a host exists, so `_host` is non-null here."
2938
+ "description": "Select a named theme from the host's registry. The theme-name buttons only\r\nrender when a host exists, so `_host` is non-null here."
2939
2939
  },
2940
2940
  {
2941
2941
  "kind": "method",
@@ -2972,7 +2972,7 @@
2972
2972
  }
2973
2973
  }
2974
2974
  ],
2975
- "description": "Set the active export destination; the menu stays open so a format can be\nchosen next."
2975
+ "description": "Set the active export destination; the menu stays open so a format can be\r\nchosen next."
2976
2976
  },
2977
2977
  {
2978
2978
  "kind": "method",
@@ -2991,7 +2991,7 @@
2991
2991
  }
2992
2992
  }
2993
2993
  ],
2994
- "description": "Emit `fsl-export` with the chosen format's content + the active destination.\nThe embedder performs the actual clipboard / file save."
2994
+ "description": "Emit `fsl-export` with the chosen format's content + the active destination.\r\nThe embedder performs the actual clipboard / file save."
2995
2995
  },
2996
2996
  {
2997
2997
  "kind": "method",
@@ -3233,7 +3233,7 @@
3233
3233
  "description": "SVG markup from the viz pipeline (`machine_to_svg_string`, etc.)."
3234
3234
  }
3235
3235
  ],
3236
- "description": "Reorder a graphviz-rendered SVG's paint stack so action labels can't be\npainted over by edges. Graphviz interleaves nodes and edges and keeps each\nedge's label `<text>` inside the edge group, so a later edge can draw over an\nearlier edge's label. This lifts the layers into a clean back-to-front order:\n\n background → edges → nodes → action (edge) labels\n\nEach edge's label text is hoisted out of its edge group to the very top.\nMarkup that isn't graphviz output (no `g.graph`) is returned untouched."
3236
+ "description": "Reorder a graphviz-rendered SVG's paint stack so action labels can't be\r\npainted over by edges. Graphviz interleaves nodes and edges and keeps each\r\nedge's label `<text>` inside the edge group, so a later edge can draw over an\r\nearlier edge's label. This lifts the layers into a clean back-to-front order:\r\n\r\n background → edges → nodes → action (edge) labels\r\n\r\nEach edge's label text is hoisted out of its edge group to the very top.\r\nMarkup that isn't graphviz output (no `g.graph`) is returned untouched."
3237
3237
  }
3238
3238
  ],
3239
3239
  "exports": [
@@ -22956,7 +22956,7 @@ var constants = /*#__PURE__*/Object.freeze({
22956
22956
  * Useful for runtime diagnostics and for embedding in serialized machine
22957
22957
  * snapshots so that deserializers can detect version-skew.
22958
22958
  */
22959
- const version = "5.148.0";
22959
+ const version = "5.148.2";
22960
22960
 
22961
22961
  // whargarbl lots of these return arrays could/should be sets
22962
22962
  const { state_name_chars, state_name_first_chars, action_label_chars } = constants;
package/dist/cdn/viz.js CHANGED
@@ -22981,7 +22981,7 @@ var constants = /*#__PURE__*/Object.freeze({
22981
22981
  * Useful for runtime diagnostics and for embedding in serialized machine
22982
22982
  * snapshots so that deserializers can detect version-skew.
22983
22983
  */
22984
- const version = "5.148.0";
22984
+ const version = "5.148.2";
22985
22985
 
22986
22986
  // whargarbl lots of these return arrays could/should be sets
22987
22987
  const { state_name_chars, state_name_first_chars, action_label_chars } = constants;
@@ -108,7 +108,7 @@ function parseFslArgs(argv, spec) {
108
108
  return { positional, flags, helpText };
109
109
  }
110
110
 
111
- const getVersion = () => "5.148.0";
111
+ const getVersion = () => "5.148.2";
112
112
  const SPEC = {
113
113
  flags: {
114
114
  help: { short: "h", boolean: true },
@@ -171,12 +171,12 @@ Idle 'cancel' -> Off;
171
171
 
172
172
  ### Explicit State Declarations and Attributes
173
173
  \`\`\`fsl
174
- state Red {
174
+ state Red : {
175
175
  background-color : red;
176
176
  text-color : white;
177
177
  };
178
178
 
179
- state Green {
179
+ state Green : {
180
180
  background-color : green;
181
181
  };
182
182