neo.mjs 6.9.10 → 6.9.12
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/apps/ServiceWorker.mjs +2 -2
- package/apps/learnneo/index.html +4 -3
- package/apps/learnneo/neo-config.json +2 -1
- package/apps/learnneo/store/Content.mjs +1 -1
- package/apps/learnneo/view/Viewport.mjs +18 -0
- package/apps/learnneo/view/ViewportController.mjs +2 -2
- package/apps/learnneo/view/home/ContentTreeList.mjs +22 -14
- package/apps/learnneo/view/home/ContentView.mjs +60 -0
- package/apps/learnneo/view/home/MainContainer.mjs +14 -6
- package/apps/learnneo/view/home/MainContainerController.mjs +57 -18
- package/apps/learnneo/view/home/MainContainerModel.mjs +3 -5
- package/apps/newwebsite/app.mjs +6 -0
- package/apps/newwebsite/index.html +13 -0
- package/apps/newwebsite/neo-config.json +7 -0
- package/apps/newwebsite/view/MainContainer.mjs +59 -0
- package/buildScripts/convertDesignTokens.mjs +173 -0
- package/buildScripts/webpack/json/myApps.template.json +1 -0
- package/examples/ConfigurationViewport.mjs +12 -9
- package/examples/ServiceWorker.mjs +2 -2
- package/package.json +3 -2
- package/resources/data/{learnneo → deck/learnneo}/p/2023-10-01T18-29-19-158Z.md +3 -6
- package/resources/data/deck/learnneo/p/2023-10-08T20-20-37-336Z.md +36 -0
- package/resources/data/deck/learnneo/p/stylesheet.md +58 -0
- package/resources/data/{learnneo → deck/learnneo}/t.json +19 -2
- package/resources/data/deck/training/p/2022-12-27T21-54-52-300Z.md +11 -0
- package/resources/data/deck/training/p/2022-12-27T21-55-23-144Z.md +43 -0
- package/resources/data/deck/training/p/2022-12-27T21-55-30-948Z.md +1 -0
- package/resources/data/deck/training/p/2022-12-27T21-55-43-542Z.md +84 -0
- package/resources/data/deck/training/p/2022-12-27T22-23-55-083Z.md +1 -0
- package/resources/data/deck/training/p/2022-12-27T22-24-07-886Z.md +8 -0
- package/resources/data/deck/training/p/2022-12-27T22-24-52-295Z.md +8 -0
- package/resources/data/deck/training/p/2022-12-27T22-25-03-853Z.md +5 -0
- package/resources/data/deck/training/p/2022-12-27T22-43-58-924Z.md +10 -0
- package/resources/data/deck/training/p/2022-12-27T22-44-28-881Z.md +3 -0
- package/resources/data/deck/training/p/2022-12-27T22-44-41-791Z.md +4 -0
- package/resources/data/deck/training/p/2022-12-27T22-45-21-032Z.md +7 -0
- package/resources/data/deck/training/p/2022-12-27T22-49-22-078Z.md +4 -0
- package/resources/data/deck/training/p/2022-12-27T22-50-20-626Z.md +4 -0
- package/resources/data/deck/training/p/2022-12-28T16-58-47-786Z.md +0 -0
- package/resources/data/deck/training/p/2022-12-28T16-58-55-192Z.md +9 -0
- package/resources/data/deck/training/p/2022-12-28T17-10-18-058Z.md +15 -0
- package/resources/data/deck/training/p/2022-12-28T17-10-42-296Z.md +40 -0
- package/resources/data/deck/training/p/2022-12-28T17-11-34-653Z.md +41 -0
- package/resources/data/deck/training/p/2022-12-28T17-13-09-994Z.md +0 -0
- package/resources/data/deck/training/p/2022-12-28T21-32-14-420Z.md +0 -0
- package/resources/data/deck/training/p/2022-12-29T01-43-32-431Z.md +7 -0
- package/resources/data/deck/training/p/2022-12-29T15-56-54-485Z.md +7 -0
- package/resources/data/deck/training/p/2022-12-29T15-57-11-499Z.md +7 -0
- package/resources/data/deck/training/p/2022-12-29T16-00-13-223Z.md +7 -0
- package/resources/data/deck/training/p/2022-12-29T18-34-25-826Z.md +4 -0
- package/resources/data/deck/training/p/2022-12-29T18-36-08-226Z.md +106 -0
- package/resources/data/deck/training/p/2022-12-29T18-36-56-893Z.md +112 -0
- package/resources/data/deck/training/p/2022-12-29T19-31-30-507Z.md +31 -0
- package/resources/data/deck/training/p/2022-12-29T19-31-55-091Z.md +14 -0
- package/resources/data/deck/training/p/2022-12-29T20-03-42-628Z.md +9 -0
- package/resources/data/deck/training/p/2022-12-29T20-21-20-669Z.md +7 -0
- package/resources/data/deck/training/p/2022-12-29T20-37-08-919Z.md +46 -0
- package/resources/data/deck/training/p/2022-12-29T20-37-20-344Z.md +43 -0
- package/resources/data/deck/training/p/2022-12-30T19-04-30-990Z.md +8 -0
- package/resources/data/deck/training/p/2022-12-31T18-43-56-338Z.md +7 -0
- package/resources/data/deck/training/p/2022-12-31T18-51-50-682Z.md +1 -0
- package/resources/data/deck/training/p/2022-12-31T18-54-04-176Z.md +4 -0
- package/resources/data/deck/training/p/2022-12-31T22-11-55-555Z.md +112 -0
- package/resources/data/deck/training/p/2022-12-31T23-00-41-222Z.md +6 -0
- package/resources/data/deck/training/p/2022-12-31T23-18-55-655Z.md +69 -0
- package/resources/data/deck/training/p/2022-12-31T23-25-40-735Z.md +21 -0
- package/resources/data/deck/training/p/2022-12-31T23-25-51-014Z.md +7 -0
- package/resources/data/deck/training/p/2023-01-01T17-49-18-429Z.md +3 -0
- package/resources/data/deck/training/p/2023-01-01T18-44-07-034Z.md +34 -0
- package/resources/data/deck/training/p/2023-01-01T18-47-39-766Z.md +15 -0
- package/resources/data/deck/training/p/2023-01-01T19-04-22-830Z.md +4 -0
- package/resources/data/deck/training/p/2023-01-01T21-11-58-025Z.md +25 -0
- package/resources/data/deck/training/p/2023-01-01T21-12-37-340Z.md +23 -0
- package/resources/data/deck/training/p/2023-01-01T21-13-13-880Z.md +8 -0
- package/resources/data/deck/training/p/2023-01-01T21-14-45-740Z.md +98 -0
- package/resources/data/deck/training/p/2023-01-01T21-18-23-886Z.md +26 -0
- package/resources/data/deck/training/p/2023-01-01T21-18-31-316Z.md +19 -0
- package/resources/data/deck/training/p/2023-01-01T21-18-42-290Z.md +23 -0
- package/resources/data/deck/training/p/2023-01-01T21-19-57-020Z.md +24 -0
- package/resources/data/deck/training/p/2023-01-01T21-22-31-184Z.md +13 -0
- package/resources/data/deck/training/p/2023-01-01T21-22-38-317Z.md +17 -0
- package/resources/data/deck/training/p/2023-01-01T21-22-47-693Z.md +20 -0
- package/resources/data/deck/training/p/2023-01-01T21-23-17-716Z.md +39 -0
- package/resources/data/deck/training/p/2023-01-01T21-23-28-532Z.md +22 -0
- package/resources/data/deck/training/p/2023-01-01T21-25-23-899Z.md +3 -0
- package/resources/data/deck/training/p/2023-01-01T21-25-59-742Z.md +1 -0
- package/resources/data/deck/training/p/2023-01-01T21-26-53-748Z.md +12 -0
- package/resources/data/deck/training/p/2023-01-01T23-38-42-863Z.md +2 -0
- package/resources/data/deck/training/p/2023-01-03T02-07-19-014Z.md +143 -0
- package/resources/data/deck/training/p/2023-01-04T01-52-23-454Z.md +76 -0
- package/resources/data/deck/training/p/2023-01-06T23-21-12-009Z.md +127 -0
- package/resources/data/deck/training/p/2023-01-06T23-21-31-685Z.md +81 -0
- package/resources/data/deck/training/p/2023-01-06T23-21-59-596Z.md +36 -0
- package/resources/data/deck/training/p/2023-01-06T23-34-13-897Z.md +87 -0
- package/resources/data/deck/training/p/2023-01-06T23-44-02-340Z.md +0 -0
- package/resources/data/deck/training/p/2023-01-06T23-46-36-687Z.md +1 -0
- package/resources/data/deck/training/p/2023-01-06T23-46-45-783Z.md +33 -0
- package/resources/data/deck/training/p/2023-01-08T00-45-11-144Z.md +50 -0
- package/resources/data/deck/training/p/2023-01-08T01-06-31-267Z.md +41 -0
- package/resources/data/deck/training/p/2023-01-08T01-24-21-088Z.md +95 -0
- package/resources/data/deck/training/p/2023-01-08T01-25-12-557Z.md +11 -0
- package/resources/data/deck/training/p/2023-01-08T01-46-50-723Z.md +25 -0
- package/resources/data/deck/training/p/2023-01-08T02-09-07-802Z.md +18 -0
- package/resources/data/deck/training/p/2023-01-08T02-09-19-678Z.md +66 -0
- package/resources/data/deck/training/p/2023-01-08T02-11-26-333Z.md +29 -0
- package/resources/data/deck/training/p/2023-01-08T17-22-48-841Z.md +14 -0
- package/resources/data/deck/training/p/2023-01-08T20-46-11-806Z.md +5 -0
- package/resources/data/deck/training/p/2023-01-08T20-47-23-682Z.md +5 -0
- package/resources/data/deck/training/p/2023-01-08T20-47-32-064Z.md +13 -0
- package/resources/data/deck/training/p/2023-01-08T20-47-57-045Z.md +0 -0
- package/resources/data/deck/training/p/2023-01-08T20-48-03-791Z.md +18 -0
- package/resources/data/deck/training/p/2023-01-08T20-48-32-466Z.md +9 -0
- package/resources/data/deck/training/p/2023-01-08T20-48-51-322Z.md +20 -0
- package/resources/data/deck/training/p/2023-01-08T20-49-52-741Z.md +0 -0
- package/resources/data/deck/training/p/2023-01-08T20-52-03-556Z.md +0 -0
- package/resources/data/deck/training/p/2023-01-08T20-57-36-333Z.md +2 -0
- package/resources/data/deck/training/p/2023-01-08T20-57-51-136Z.md +5 -0
- package/resources/data/deck/training/p/2023-01-09T00-07-37-951Z.md +0 -0
- package/resources/data/deck/training/p/2023-01-09T00-35-40-671Z.md +3 -0
- package/resources/data/deck/training/p/2023-01-10T01-29-38-148Z.md +10 -0
- package/resources/data/deck/training/p/2023-01-10T01-43-12-166Z.md +31 -0
- package/resources/data/deck/training/p/2023-01-10T02-21-54-303Z.md +10 -0
- package/resources/data/deck/training/p/2023-01-12T01-50-54-617Z.md +74 -0
- package/resources/data/deck/training/p/2023-01-13T19-55-24-735Z.md +14 -0
- package/resources/data/deck/training/p/2023-01-13T20-08-27-068Z.md +28 -0
- package/resources/data/deck/training/p/2023-01-13T20-23-38-411Z.md +25 -0
- package/resources/data/deck/training/p/2023-01-13T20-37-06-267Z.md +13 -0
- package/resources/data/deck/training/p/2023-01-13T21-05-57-708Z.md +8 -0
- package/resources/data/deck/training/p/2023-01-13T21-48-17-258Z.md +20 -0
- package/resources/data/deck/training/p/2023-01-13T22-05-05-799Z.md +14 -0
- package/resources/data/deck/training/p/2023-01-13T22-08-30-863Z.md +17 -0
- package/resources/data/deck/training/p/2023-01-13T23-01-50-449Z.md +4 -0
- package/resources/data/deck/training/p/2023-01-14T00-33-05-958Z.md +62 -0
- package/resources/data/deck/training/p/2023-01-14T00-40-27-784Z.md +229 -0
- package/resources/data/deck/training/p/2023-01-14T00-41-59-081Z.md +153 -0
- package/resources/data/deck/training/p/2023-01-14T13-50-28-199Z.md +19 -0
- package/resources/data/deck/training/p/2023-01-14T13-59-20-275Z.md +6 -0
- package/resources/data/deck/training/p/2023-01-14T14-03-29-456Z.md +3 -0
- package/resources/data/deck/training/p/2023-01-14T14-27-57-678Z.md +7 -0
- package/resources/data/deck/training/p/2023-01-14T17-30-18-228Z.md +33 -0
- package/resources/data/deck/training/p/2023-01-14T18-28-39-316Z.md +1 -0
- package/resources/data/deck/training/p/2023-01-14T18-28-44-115Z.md +4 -0
- package/resources/data/deck/training/p/2023-01-14T18-28-49-548Z.md +18 -0
- package/resources/data/deck/training/p/2023-01-14T18-40-13-758Z.md +10 -0
- package/resources/data/deck/training/p/2023-01-14T19-29-15-291Z.md +12 -0
- package/resources/data/deck/training/p/2023-01-15T18-51-52-134Z.md +83 -0
- package/resources/data/deck/training/p/2023-01-15T20-03-30-073Z.md +11 -0
- package/resources/data/deck/training/p/2023-01-15T22-07-52-073Z.md +16 -0
- package/resources/data/deck/training/p/2023-01-15T22-22-13-517Z.md +12 -0
- package/resources/data/deck/training/p/2023-01-15T22-28-57-508Z.md +131 -0
- package/resources/data/deck/training/p/2023-01-15T22-36-30-913Z.md +115 -0
- package/resources/data/deck/training/p/2023-01-16T16-03-40-770Z.md +12 -0
- package/resources/data/deck/training/p/2023-01-16T20-21-56-859Z.md +5 -0
- package/resources/data/deck/training/p/2023-01-16T20-24-09-690Z.md +24 -0
- package/resources/data/deck/training/p/2023-01-20T12-51-22-646Z.md +21 -0
- package/resources/data/deck/training/p/2023-01-20T13-06-46-614Z.md +9 -0
- package/resources/data/deck/training/p/2023-01-20T13-08-51-600Z.md +7 -0
- package/resources/data/deck/training/p/2023-01-20T15-20-13-363Z.md +26 -0
- package/resources/data/deck/training/p/2023-01-20T15-34-58-813Z.md +75 -0
- package/resources/data/deck/training/p/2023-01-21T16-33-20-458Z.md +33 -0
- package/resources/data/deck/training/p/2023-01-21T16-45-28-263Z.md +28 -0
- package/resources/data/deck/training/p/2023-01-21T16-56-25-452Z.md +3 -0
- package/resources/data/deck/training/p/2023-01-21T17-28-31-493Z.md +6 -0
- package/resources/data/deck/training/p/2023-01-21T19-49-51-918Z.md +13 -0
- package/resources/data/deck/training/p/2023-01-21T20-08-24-452Z.md +15 -0
- package/resources/data/deck/training/p/2023-01-21T20-35-54-947Z.md +20 -0
- package/resources/data/deck/training/p/2023-01-21T20-54-47-603Z.md +39 -0
- package/resources/data/deck/training/p/2023-01-21T20-56-28-184Z.md +25 -0
- package/resources/data/deck/training/p/2023-01-21T20-57-32-927Z.md +4 -0
- package/resources/data/deck/training/p/2023-01-21T23-13-33-394Z.md +6 -0
- package/resources/data/deck/training/p/2023-01-28T19-11-37-464Z.md +24 -0
- package/resources/data/deck/training/p/2023-01-28T20-43-41-188Z.md +9 -0
- package/resources/data/deck/training/p/2023-01-28T20-53-56-476Z.md +8 -0
- package/resources/data/deck/training/p/2023-01-28T20-58-43-776Z.md +10 -0
- package/resources/data/deck/training/p/2023-01-28T22-18-41-259Z.md +33 -0
- package/resources/data/deck/training/p/2023-01-28T22-24-34-808Z.md +24 -0
- package/resources/data/deck/training/p/2023-01-29T16-25-24-528Z.md +44 -0
- package/resources/data/deck/training/p/2023-01-29T21-14-32-588Z.md +12 -0
- package/resources/data/deck/training/p/2023-01-31T19-24-53-504Z.md +8 -0
- package/resources/data/deck/training/p/2023-01-31T20-33-55-855Z.md +11 -0
- package/resources/data/deck/training/p/2023-01-31T20-34-30-261Z.md +7 -0
- package/resources/data/deck/training/p/2023-01-31T20-52-53-367Z.md +43 -0
- package/resources/data/deck/training/p/2023-02-04T15-18-35-682Z.md +20 -0
- package/resources/data/deck/training/p/2023-02-04T15-49-47-597Z.md +14 -0
- package/resources/data/deck/training/p/2023-02-04T18-58-57-808Z.md +1 -0
- package/resources/data/deck/training/p/2023-02-04T20-07-11-288Z.md +1 -0
- package/resources/data/deck/training/p/2023-02-04T20-09-50-169Z.md +1 -0
- package/resources/data/deck/training/p/2023-02-04T20-19-42-740Z.md +8 -0
- package/resources/data/deck/training/p/2023-02-04T20-23-56-013Z.md +12 -0
- package/resources/data/deck/training/p/2023-02-04T20-28-12-391Z.md +20 -0
- package/resources/data/deck/training/p/2023-02-05T00-20-32-554Z.md +16 -0
- package/resources/data/deck/training/p/2023-02-05T00-35-56-282Z.md +13 -0
- package/resources/data/deck/training/p/2023-02-05T15-36-57-182Z.md +24 -0
- package/resources/data/deck/training/p/2023-02-05T17-39-51-712Z.md +70 -0
- package/resources/data/deck/training/p/2023-02-05T17-44-53-815Z.md +195 -0
- package/resources/data/deck/training/p/2023-02-05T17-45-40-114Z.md +92 -0
- package/resources/data/deck/training/p/2023-02-05T18-12-14-489Z.md +60 -0
- package/resources/data/deck/training/p/2023-02-06T00-14-54-457Z.md +9 -0
- package/resources/data/deck/training/p/2023-06-28T18-03-14-313Z.md +8 -0
- package/resources/data/deck/training/p/2023-06-28T18-26-17-290Z.md +7 -0
- package/resources/data/deck/training/p/2023-06-28T21-16-24-034Z.md +40 -0
- package/resources/data/deck/training/p/2023-06-28T21-16-34-972Z.md +16 -0
- package/resources/data/deck/training/p/2023-06-28T21-28-28-379Z.md +4 -0
- package/resources/data/deck/training/p/2023-06-29T23-15-10-411Z.md +5 -0
- package/resources/data/deck/training/p/2023-07-01T15-42-45-193Z.md +433 -0
- package/resources/data/deck/training/p/2023-07-01T21-54-31-329Z.md +6 -0
- package/resources/data/deck/training/p/2023-07-02T16-14-06-970Z.md +14 -0
- package/resources/data/deck/training/p/2023-07-31T00-26-03-842Z.md +4 -0
- package/resources/data/deck/training/p/2023-07-31T00-31-51-933Z.md +10 -0
- package/resources/data/deck/training/p/2023-07-31T00-37-21-927Z.md +205 -0
- package/resources/data/deck/training/p/2023-10-01T18-29-19-158Z.md +76 -0
- package/resources/data/deck/training/p/2023-10-07T19-18-28-517Z.md +102 -0
- package/resources/data/deck/training/p/2023-10-08T20-20-07-934Z.md +75 -0
- package/resources/data/deck/training/p/2023-10-08T20-37-30-658Z.md +0 -0
- package/resources/data/deck/training/p/2023-10-08T21-58-25-809Z.md +68 -0
- package/resources/data/deck/training/p/2023-10-08T22-22-11-013Z.md +0 -0
- package/resources/data/deck/training/p/2023-10-14T19-25-08-153Z.md +119 -0
- package/resources/data/deck/training/t.json +1276 -0
- package/resources/design-tokens/json/component.json +288 -0
- package/resources/design-tokens/json/core.json +352 -0
- package/resources/design-tokens/json/semantic.json +231 -0
- package/resources/scss/src/apps/learnneo/Viewport.scss +3 -0
- package/resources/scss/src/apps/learnneo/home/ContentTreeList.scss +60 -13
- package/resources/scss/src/apps/learnneo/home/ContentView.scss +58 -0
- package/resources/scss/src/apps/newwebsite/MainContainer.scss +32 -0
- package/resources/scss/src/list/Base.scss +1 -1
- package/resources/scss/theme-neo-light/Global.scss +65 -1
- package/resources/scss/theme-neo-light/design-tokens/Component.scss +64 -0
- package/resources/scss/theme-neo-light/design-tokens/Core.scss +67 -0
- package/resources/scss/theme-neo-light/design-tokens/Semantic.scss +61 -0
- package/resources/scss/theme-neo-light/design-tokens/_all.scss +4 -0
- package/resources/scss/theme-neo-light/list/Base.scss +29 -6
- package/src/DefaultConfig.mjs +4 -4
- package/src/controller/Base.mjs +31 -23
- package/src/data/connection/Xhr.mjs +1 -1
- /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-07T19-18-28-517Z.md +0 -0
- /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T20-20-07-934Z.md +0 -0
- /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T20-37-30-658Z.md +0 -0
- /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T21-58-25-809Z.md +0 -0
- /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-08T22-22-11-013Z.md +0 -0
- /package/resources/data/{learnneo → deck/learnneo}/p/2023-10-14T19-25-08-153Z.md +0 -0
- /package/resources/data/{learnneo → deck/learnneo}/pages/whyneo.md +0 -0
- /package/resources/data/{learnneo → deck/learnneo}/tree.json +0 -0
- /package/resources/data/{learnneo → deck/training}/p/2023-10-08T20-20-37-336Z.md +0 -0
- /package/resources/{deck → data/deck}/whyneo.md +0 -0
@@ -0,0 +1,173 @@
|
|
1
|
+
import fs from 'fs-extra';
|
2
|
+
import os from 'os';
|
3
|
+
import path from 'path';
|
4
|
+
|
5
|
+
let jsonPath = './resources/design-tokens/json',
|
6
|
+
jsonFolder = fs.readdirSync(jsonPath),
|
7
|
+
tokenPrefix = '',
|
8
|
+
tokenRegex = new RegExp(/{(.*?)}/g),
|
9
|
+
emptyString, fileContent, keyMaxLength, map, match, matches, output;
|
10
|
+
|
11
|
+
function capitalize(value) {
|
12
|
+
return value[0].toUpperCase() + value.slice(1);
|
13
|
+
}
|
14
|
+
|
15
|
+
function createEmptyString(len) {
|
16
|
+
return ' '.repeat(len);
|
17
|
+
}
|
18
|
+
|
19
|
+
function parseTokens(fileContent, prefix=tokenPrefix, map=[]) {
|
20
|
+
let baseKey, baseValue, keyValue, keys, modify, ns;
|
21
|
+
|
22
|
+
Object.entries(fileContent).forEach(([key, value]) => {
|
23
|
+
key = key.replace(/\?/g, '');
|
24
|
+
key = key.replace(/&/g, '-'); // some token names contain & chars
|
25
|
+
ns = prefix === tokenPrefix ? (tokenPrefix + key) : key === 'value' ? prefix : `${prefix}-${key}`;
|
26
|
+
|
27
|
+
if (typeof value === 'object') {
|
28
|
+
keys = Object.keys(value);
|
29
|
+
modify = value[keys[0]]?.$extensions?.['studio.tokens']?.modify || // the first key could contain the value,
|
30
|
+
value[keys[1]]?.$extensions?.['studio.tokens']?.modify; // so we are checking the 2nd too
|
31
|
+
|
32
|
+
if (modify) {
|
33
|
+
// assuming that each object contains its base value
|
34
|
+
keys.forEach(objKey => {
|
35
|
+
if (!value[objKey].$extensions) {
|
36
|
+
baseKey = objKey;
|
37
|
+
baseValue = value[baseKey].value;
|
38
|
+
}
|
39
|
+
});
|
40
|
+
|
41
|
+
keys.forEach(objKey => {
|
42
|
+
if (objKey !== baseKey) {
|
43
|
+
modify = value[objKey].$extensions?.['studio.tokens']?.modify;
|
44
|
+
keyValue = `${modify.type}(${baseValue}, ${modify.value * 100}%)`;
|
45
|
+
|
46
|
+
map.push([`${ns}-${objKey}`, keyValue]);
|
47
|
+
} else {
|
48
|
+
parseTokens(value[baseKey], `${ns}-${baseKey}`, map);
|
49
|
+
}
|
50
|
+
})
|
51
|
+
} else {
|
52
|
+
parseTokens(value, ns, map);
|
53
|
+
}
|
54
|
+
} else if (key !== 'description' && key !== 'type') {
|
55
|
+
if (typeof value === 'string') {
|
56
|
+
if (!value.includes('{')) {
|
57
|
+
if (value.includes(' ')) {
|
58
|
+
value = `'${value}'`;
|
59
|
+
}
|
60
|
+
} else {
|
61
|
+
value = value.replace(/\?/g, '');
|
62
|
+
matches = value.matchAll(tokenRegex);
|
63
|
+
|
64
|
+
// replace . with - only inside each token
|
65
|
+
for (match of matches) {
|
66
|
+
value = value.replace(match[0], match[0].replace(/\./g, '-'));
|
67
|
+
}
|
68
|
+
|
69
|
+
/*
|
70
|
+
* some design tokens contain operations without empty spaces
|
71
|
+
* e.g. {token}*0.9
|
72
|
+
* calc() relies on having spaces around operators
|
73
|
+
*/
|
74
|
+
value = value.replace(/(\S)(\*)(\S)/g, '$1 $2 $3');
|
75
|
+
value = value.replace(/(\S)(\/)(\S)/g, '$1 $2 $3');
|
76
|
+
|
77
|
+
// most likely a multiplication
|
78
|
+
if (!value.endsWith('}')) {
|
79
|
+
value = `calc(${value})`;
|
80
|
+
}
|
81
|
+
|
82
|
+
// convert tokens into CSS variables
|
83
|
+
value = value.replace(/{(.*?)}/g, `var(--${tokenPrefix}$1)`);
|
84
|
+
|
85
|
+
// multiple occurrences of a css variable need to get wrapped into calc()
|
86
|
+
if (value.indexOf('var') !== value.lastIndexOf('var')) {
|
87
|
+
value = `calc(${value})`;
|
88
|
+
}
|
89
|
+
|
90
|
+
// -token needs to get converted
|
91
|
+
if (value.startsWith('-')) {
|
92
|
+
value = `calc(${value.substring(1)} * -1)`
|
93
|
+
}
|
94
|
+
}
|
95
|
+
}
|
96
|
+
|
97
|
+
map.push([ns, value]);
|
98
|
+
}
|
99
|
+
});
|
100
|
+
|
101
|
+
return map;
|
102
|
+
}
|
103
|
+
|
104
|
+
function replaceObjectValue(obj) {
|
105
|
+
Object.entries(obj).forEach(([key, value]) => {
|
106
|
+
if (key === 'value') {
|
107
|
+
if (typeof value === 'object') {
|
108
|
+
Object.entries(value).forEach(([valKey, prop]) => {
|
109
|
+
// some token vars contain an empty string, which SCSS can not handle.
|
110
|
+
if (prop === '') {
|
111
|
+
prop = 'none';
|
112
|
+
}
|
113
|
+
|
114
|
+
obj[valKey] = {
|
115
|
+
type : obj.type,
|
116
|
+
value: prop
|
117
|
+
};
|
118
|
+
});
|
119
|
+
|
120
|
+
delete obj.type;
|
121
|
+
delete obj.value;
|
122
|
+
}
|
123
|
+
} else if (typeof value === 'object') {
|
124
|
+
replaceObjectValue(value);
|
125
|
+
}
|
126
|
+
});
|
127
|
+
}
|
128
|
+
|
129
|
+
function sortArray(a, b) {
|
130
|
+
const nameA = a[0].toUpperCase();
|
131
|
+
const nameB = b[0].toUpperCase();
|
132
|
+
if (nameA < nameB) {
|
133
|
+
return -1;
|
134
|
+
}
|
135
|
+
if (nameA > nameB) {
|
136
|
+
return 1;
|
137
|
+
}
|
138
|
+
|
139
|
+
return 0;
|
140
|
+
}
|
141
|
+
|
142
|
+
jsonFolder.forEach(fileName => {
|
143
|
+
if (fileName.endsWith(".json")) {
|
144
|
+
console.log('Parsing file:', fileName);
|
145
|
+
|
146
|
+
fileContent = JSON.parse(fs.readFileSync(path.join(jsonPath, fileName)));
|
147
|
+
keyMaxLength = 0;
|
148
|
+
output = [':root .neo-theme-neo-light {'];
|
149
|
+
|
150
|
+
replaceObjectValue(fileContent);
|
151
|
+
|
152
|
+
map = parseTokens(fileContent);
|
153
|
+
|
154
|
+
map.sort(sortArray);
|
155
|
+
|
156
|
+
map.forEach(item => {
|
157
|
+
keyMaxLength = Math.max(item[0].length, keyMaxLength);
|
158
|
+
});
|
159
|
+
|
160
|
+
map.forEach(item => {
|
161
|
+
emptyString = createEmptyString(keyMaxLength - item[0].length);
|
162
|
+
|
163
|
+
output.push(` --${item[0] + emptyString}: ${item[1]};`);
|
164
|
+
});
|
165
|
+
|
166
|
+
output.push('}');
|
167
|
+
output.push('');
|
168
|
+
|
169
|
+
fileName = capitalize(fileName.split('.').shift()) + '.scss'
|
170
|
+
|
171
|
+
fs.writeFileSync(path.join('./resources/scss/theme-neo-light/design-tokens/', fileName), output.join(os.EOL));
|
172
|
+
}
|
173
|
+
});
|
@@ -6,8 +6,9 @@ import Viewport from '../src/container/Viewport.mjs';
|
|
6
6
|
|
7
7
|
// add custom themes here
|
8
8
|
const themes = [
|
9
|
-
{name: 'neo-theme-
|
10
|
-
{name: 'neo-theme-
|
9
|
+
{name: 'neo-theme-light', label: 'Theme Light'},
|
10
|
+
{name: 'neo-theme-dark', label: 'Theme Dark'},
|
11
|
+
{name: 'neo-theme-neo-light', label: 'Theme Neo-Light'}
|
11
12
|
]
|
12
13
|
|
13
14
|
/**
|
@@ -121,12 +122,12 @@ class ConfigurationViewport extends Viewport {
|
|
121
122
|
handler: bindAppend(me.onSwitchTheme, me, 'cmp'),
|
122
123
|
style : {marginTop: '20px'},
|
123
124
|
text : theme === 'neo-theme-dark' ? 'Theme Light' : 'Theme Dark',
|
124
|
-
width :
|
125
|
+
width : 130
|
125
126
|
}, {
|
126
127
|
module : Button,
|
127
128
|
handler: me.logInstance.bind(me),
|
128
129
|
text : 'Log Instance',
|
129
|
-
width :
|
130
|
+
width : 130
|
130
131
|
}]
|
131
132
|
}]
|
132
133
|
}];
|
@@ -184,7 +185,7 @@ class ConfigurationViewport extends Viewport {
|
|
184
185
|
let me = this,
|
185
186
|
button = data.component,
|
186
187
|
countThemes = themes.length,
|
187
|
-
newTheme, oldIndex, oldTheme, themeIndex;
|
188
|
+
futureIndex, newTheme, oldIndex, oldTheme, themeIndex;
|
188
189
|
|
189
190
|
themes.forEach((theme, index) => {
|
190
191
|
if (button.text === theme.label) {
|
@@ -193,14 +194,16 @@ class ConfigurationViewport extends Viewport {
|
|
193
194
|
}
|
194
195
|
});
|
195
196
|
|
196
|
-
|
197
|
-
|
197
|
+
futureIndex = (themeIndex + countThemes +1) % countThemes;
|
198
|
+
oldIndex = (themeIndex + countThemes -1) % countThemes;
|
199
|
+
oldTheme = themes[oldIndex].name;
|
198
200
|
|
199
|
-
|
201
|
+
|
202
|
+
button.text = themes[futureIndex].label;
|
200
203
|
|
201
204
|
if (target === 'cmp') {
|
202
205
|
me.exampleComponent.theme = newTheme;
|
203
|
-
} else {
|
206
|
+
} else {console.log(newTheme, oldTheme);
|
204
207
|
Neo.applyDeltas(me.appName, {
|
205
208
|
cls: {
|
206
209
|
add : [newTheme],
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "neo.mjs",
|
3
|
-
"version": "6.9.
|
3
|
+
"version": "6.9.12",
|
4
4
|
"description": "The webworkers driven UI framework",
|
5
5
|
"type": "module",
|
6
6
|
"repository": {
|
@@ -16,6 +16,7 @@
|
|
16
16
|
"build-all-questions": "node ./buildScripts/buildAll.mjs -f",
|
17
17
|
"build-themes": "node ./buildScripts/buildThemes.mjs -f",
|
18
18
|
"build-threads": "node ./buildScripts/webpack/buildThreads.mjs -f",
|
19
|
+
"convert-design-tokens": "node ./buildScripts/convertDesignTokens.mjs",
|
19
20
|
"create-app": "node ./buildScripts/createApp.mjs",
|
20
21
|
"create-class": "node ./buildScripts/createClass.mjs",
|
21
22
|
"create-component": "node ./buildScripts/createComponent.mjs",
|
@@ -52,7 +53,7 @@
|
|
52
53
|
"envinfo": "^7.11.0",
|
53
54
|
"fs-extra": "^11.1.1",
|
54
55
|
"highlightjs-line-numbers.js": "^2.8.0",
|
55
|
-
"inquirer": "^9.2.
|
56
|
+
"inquirer": "^9.2.12",
|
56
57
|
"neo-jsdoc": "1.0.1",
|
57
58
|
"neo-jsdoc-x": "1.0.5",
|
58
59
|
"postcss": "^8.4.31",
|
@@ -1,12 +1,9 @@
|
|
1
|
-
# This is a h1
|
2
|
-
## This is a h2
|
3
|
-
### This is a h3
|
4
|
-
#### This is a h4
|
5
|
-
|
6
1
|
|
7
2
|
Neo.mjs is a framework used to create <mark>browser-based</mark> applications.
|
8
3
|
|
9
|
-
Some key features and benefits of Neo.mjs are:
|
4
|
+
# Some key features and benefits of Neo.mjs are:
|
5
|
+
|
6
|
+
<code><A code snippet></code>
|
10
7
|
|
11
8
|
<details>
|
12
9
|
<summary>Multi-Threaded</summary>
|
@@ -0,0 +1,36 @@
|
|
1
|
+
Neo.mjs uses standard modular JavaScript, so you're free to use other class
|
2
|
+
features, like private members.
|
3
|
+
<pre><code class="javascript">
|
4
|
+
class Human extends Mammal {
|
5
|
+
static config = {
|
6
|
+
className: 'Simple.example.Human',
|
7
|
+
name : 'J. Doe',
|
8
|
+
married : false
|
9
|
+
}
|
10
|
+
|
11
|
+
static #privateStaticField = 'foo'
|
12
|
+
|
13
|
+
#privateInstanceField = 'bar'
|
14
|
+
|
15
|
+
#privateInstanceMethod() {
|
16
|
+
console.log(`Psst. Don't tell anyone, but ${this.#privateInstanceField} and ${Human.#privateStaticField}`);
|
17
|
+
}
|
18
|
+
|
19
|
+
speak(tellSecret) {
|
20
|
+
console.log(`Hello! My name is ${this.name}. I am ${this.married?'':'not'} married.`);
|
21
|
+
if (tellSecret) this.#privateInstanceMethod();
|
22
|
+
}
|
23
|
+
|
24
|
+
yodel() {
|
25
|
+
console.log('Yodelay hee hoo!');
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
Neo.applyClassConfig(Human);
|
30
|
+
|
31
|
+
const myPerson = Neo.create(Human, {
|
32
|
+
name: 'Herbert'
|
33
|
+
});
|
34
|
+
|
35
|
+
myPerson.speak(true);
|
36
|
+
</code></pre>
|
@@ -0,0 +1,58 @@
|
|
1
|
+
<details>
|
2
|
+
<summary>Training material advice</summary>
|
3
|
+
Training content is different than self-study content.
|
4
|
+
Training material _augments_ the lecture. The audience should be focused on what the speaker is
|
5
|
+
saying; the slides support the lecture. An important concept in writing
|
6
|
+
training material is to avoid a _wall of words_, where there are lengthy
|
7
|
+
paragraphs. People will read what's in front of them. If you have a lecture slide
|
8
|
+
with a lot of text, your audience will be reading while you are lecturing,
|
9
|
+
and information is lost.
|
10
|
+
</details>
|
11
|
+
|
12
|
+
|
13
|
+
# This is an h1
|
14
|
+
## This is an h2
|
15
|
+
### This is an h3
|
16
|
+
#### This is an h4
|
17
|
+
|
18
|
+
<br>
|
19
|
+
|
20
|
+
To show highlighted source code use
|
21
|
+
<pre>
|
22
|
+
<pre>
|
23
|
+
<code class="javascript">
|
24
|
+
// Source code goes here
|
25
|
+
</code>
|
26
|
+
</pre>
|
27
|
+
|
28
|
+
<pre>
|
29
|
+
<code class="javascript">
|
30
|
+
import Base from '../../../node_modules/neo.mjs/src/core/Base.mjs';
|
31
|
+
|
32
|
+
class Mammal extends Base {
|
33
|
+
static config = {
|
34
|
+
className: 'Simple.example.Mammal'
|
35
|
+
}
|
36
|
+
}
|
37
|
+
</code>
|
38
|
+
</pre>
|
39
|
+
|
40
|
+
For short in-line statements of code use <code> or backticks.
|
41
|
+
|
42
|
+
When definining variables avoid `var` — use `let` or `const` instead.
|
43
|
+
|
44
|
+
<br>
|
45
|
+
|
46
|
+
For expandable bullet points and lab steps use a <details> tag
|
47
|
+
<pre>
|
48
|
+
<details>
|
49
|
+
<summary>This describes the item</summary>
|
50
|
+
This is the item contents.
|
51
|
+
</details>
|
52
|
+
</pre>
|
53
|
+
|
54
|
+
<details>
|
55
|
+
<summary>This describes the item</summary>
|
56
|
+
This is the item contents.
|
57
|
+
</details>
|
58
|
+
|
@@ -4,7 +4,7 @@
|
|
4
4
|
"id": "2023-10-01T18-29-19-158Z",
|
5
5
|
"parentId": null,
|
6
6
|
"isLeaf": true,
|
7
|
-
"name": "Why Neo.mjs?"
|
7
|
+
"name": "Why Neo.mjs? "
|
8
8
|
},
|
9
9
|
{
|
10
10
|
"id": "2023-09-26T17-26-15-104Z",
|
@@ -124,7 +124,24 @@
|
|
124
124
|
"id": "2023-10-16T19-38-29-590Z",
|
125
125
|
"parentId": null,
|
126
126
|
"isLeaf": false,
|
127
|
-
"name": "Mixins"
|
127
|
+
"name": "Mixins "
|
128
|
+
},
|
129
|
+
{
|
130
|
+
"id": "2023-10-31T13-59-37-550Z",
|
131
|
+
"parentId": "2023-10-16T19-38-29-590Z",
|
132
|
+
"isLeaf": true,
|
133
|
+
"name": "New Node"
|
134
|
+
},
|
135
|
+
{
|
136
|
+
"id": "appendix",
|
137
|
+
"parentId": null,
|
138
|
+
"name": "Appendix"
|
139
|
+
},
|
140
|
+
{
|
141
|
+
"id": "stylesheet",
|
142
|
+
"parentId": "appendix",
|
143
|
+
"name": "Stylesheet",
|
144
|
+
"isLeaf": true
|
128
145
|
}
|
129
146
|
]
|
130
147
|
}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
If you look at _package.json_ you'll see what scripts you can use.
|
2
|
+
|
3
|
+
To generate a new app run<br>
|
4
|
+
`npm run create-app`
|
5
|
+
<br>You typicically choose all defaults when prompted. We'll use `create-app` a few times
|
6
|
+
during this training, but in a work environment it's not used very often.
|
7
|
+
|
8
|
+
At the start of your coding session you'll probably run <br>
|
9
|
+
`npm run server-start`
|
10
|
+
<br>and as you write code and need new classes you might run <br>
|
11
|
+
`npm run create-class`.
|
@@ -0,0 +1,43 @@
|
|
1
|
+
Neo source files are JavaScript _modules_, using the `.msj` file extension.
|
2
|
+
|
3
|
+
JavaScript modules support `import`, `export` (to control which values are
|
4
|
+
available outside of the file).
|
5
|
+
|
6
|
+
<pre class="runnable text readonly">
|
7
|
+
import Component from '../../../node_modules/neo.mjs/src/component/Base.mjs';
|
8
|
+
import TabContainer from '../../../node_modules/neo.mjs/src/tab/Container.mjs';
|
9
|
+
import Viewport from '../../../node_modules/neo.mjs/src/container/Viewport.mjs';
|
10
|
+
|
11
|
+
class MainContainer extends Viewport {
|
12
|
+
static config = {
|
13
|
+
className: 'Starter.view.MainContainer',
|
14
|
+
ntype: 'main',
|
15
|
+
autoMount: true,
|
16
|
+
style: { padding: '20px' },
|
17
|
+
layout: { ntype: 'fit' },
|
18
|
+
items: [{
|
19
|
+
module: TabContainer,
|
20
|
+
itemDefaults: {
|
21
|
+
module: Component,
|
22
|
+
cls: ['neo-examples-tab-component'],
|
23
|
+
style: { padding: '20px' }
|
24
|
+
},
|
25
|
+
items: [{
|
26
|
+
tabButtonConfig: {
|
27
|
+
iconCls: 'fa fa-home',
|
28
|
+
text: 'Tab 1'
|
29
|
+
},
|
30
|
+
vdom: { innerHTML: 'Welcome to your new Neo App.' }
|
31
|
+
}, {
|
32
|
+
tabButtonConfig: {
|
33
|
+
iconCls: 'fa fa-play-circle',
|
34
|
+
text: 'Tab 2'
|
35
|
+
},
|
36
|
+
vdom: { innerHTML: 'Have fun creating something awesome!' }
|
37
|
+
}]
|
38
|
+
}]
|
39
|
+
}
|
40
|
+
}
|
41
|
+
Neo.applyClassConfig(MainContainer);
|
42
|
+
export default MainContainer;
|
43
|
+
</pre>
|
@@ -0,0 +1 @@
|
|
1
|
+
<img height="540" src="resources/images/FlowOfExecution.jpg"></img>
|
@@ -0,0 +1,84 @@
|
|
1
|
+
Change the starter app's main view to show a table.
|
2
|
+
|
3
|
+
<pre class="runnable javascript readonly">
|
4
|
+
import Table from "../../../node_modules/neo.mjs/src/table/Container.mjs";
|
5
|
+
import Viewport from "../../../node_modules/neo.mjs/src/container/Viewport.mjs";
|
6
|
+
import Store from "../../../node_modules/neo.mjs/src/data/Store.mjs";
|
7
|
+
|
8
|
+
class MainContainer extends Viewport {
|
9
|
+
static config = {
|
10
|
+
className: "Starter.view.MainContainer",
|
11
|
+
autoMount: true,
|
12
|
+
items: [{
|
13
|
+
module: Table,
|
14
|
+
flex: 1,
|
15
|
+
store: {
|
16
|
+
module: Store,
|
17
|
+
model: {
|
18
|
+
fields: [{
|
19
|
+
name: "humanReadableLocation",
|
20
|
+
}, {
|
21
|
+
name: "size",
|
22
|
+
ntype: "data-field-float",
|
23
|
+
}, {
|
24
|
+
name: "timestamp",
|
25
|
+
type: "Date",
|
26
|
+
}, {
|
27
|
+
name: "title",
|
28
|
+
calculate: (data, field, item) => item.humanReadableLocation,
|
29
|
+
}, {
|
30
|
+
name: "position",
|
31
|
+
calculate: (data, field, item) => ({
|
32
|
+
lat: item.latitude,
|
33
|
+
lng: item.longitude,
|
34
|
+
}),
|
35
|
+
},
|
36
|
+
],
|
37
|
+
},
|
38
|
+
url: "https://apis.is/earthquake/is",
|
39
|
+
responseRoot: "results",
|
40
|
+
autoLoad: true,
|
41
|
+
},
|
42
|
+
columns: [{
|
43
|
+
dataField: "timestamp",
|
44
|
+
text: "Date",
|
45
|
+
renderer: (data) =>
|
46
|
+
data.value.toLocaleDateString(undefined, {
|
47
|
+
weekday: "long",
|
48
|
+
year: "numeric",
|
49
|
+
month: "long",
|
50
|
+
day: "numeric",
|
51
|
+
}),
|
52
|
+
}, {
|
53
|
+
dataField: "humanReadableLocation",
|
54
|
+
text: "Location",
|
55
|
+
}, {
|
56
|
+
dataField: "size",
|
57
|
+
text: "Magnitude",
|
58
|
+
align: "right",
|
59
|
+
width: 100,
|
60
|
+
renderer: (data) => data.value.toLocaleString(),
|
61
|
+
}],
|
62
|
+
}],
|
63
|
+
layout: {ntype: "fit"},
|
64
|
+
};
|
65
|
+
|
66
|
+
afterSetMounted(value, oldValue) {
|
67
|
+
super.afterSetMounted(value, oldValue);
|
68
|
+
if (!value) return;
|
69
|
+
this.addDomListeners({
|
70
|
+
"neo-debug-item-select": (event) => {
|
71
|
+
event.path.forEach((item) => {
|
72
|
+
const component = Neo.getComponent(item.id);
|
73
|
+
if (component) console.log(component);
|
74
|
+
});
|
75
|
+
},
|
76
|
+
});
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
Neo.applyClassConfig(MainContainer);
|
81
|
+
|
82
|
+
export default MainContainer;
|
83
|
+
|
84
|
+
</pre>
|
@@ -0,0 +1 @@
|
|
1
|
+
<img height="580" src="resources/images/intro/InitialTable.png"/>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
Let's review the code and see how it _describes_ what it's doing. Even if you
|
2
|
+
knew nothing about Neo you could deduce what the code is doing.
|
3
|
+
|
4
|
+
Note how the store defines the field types. This defines how values in the
|
5
|
+
feed are converted as the store's records are created.
|
6
|
+
|
7
|
+
And the table has column renderers which translate how the store values
|
8
|
+
are shown to the user.
|
@@ -0,0 +1,10 @@
|
|
1
|
+
Note that the way we've coded the app, the grid is _not_ reusable.
|
2
|
+
|
3
|
+
You can reuse any class config block by creating a new class that
|
4
|
+
extends the component's class. In other words, if you want to
|
5
|
+
reuse a table, you create a new class that extends `Neo.container.Table`
|
6
|
+
and uses the same config.
|
7
|
+
|
8
|
+
Besides reuse, other good reasons to put your components into their own classes
|
9
|
+
is make code more abstract, to isolate complexity, and to allow
|
10
|
+
those to be tested in isolation.
|
@@ -0,0 +1,7 @@
|
|
1
|
+
Now that the table is its own class
|
2
|
+
- The main container code is cleaner
|
3
|
+
- The table is reusable
|
4
|
+
|
5
|
+
Since it's reusable, we can create a couple of instances in the main container.
|
6
|
+
To do that, just copy and paste the table's config, give both `flex:1`, and
|
7
|
+
change the parent container's layout to `vbox`.
|
File without changes
|
@@ -0,0 +1,9 @@
|
|
1
|
+
As we discussed before, any time you configure a class via a config
|
2
|
+
you're free to create a class encapsulating the config properties.
|
3
|
+
|
4
|
+
In other words, any time you have an `ntype` or `module` block,
|
5
|
+
you're free to create a new class that extends that type, and
|
6
|
+
move the config to the new class `static getConfig` mehtod.
|
7
|
+
|
8
|
+
Trivial classes might be done inline. Or to keep the view cleaner,
|
9
|
+
and more declarative, use a separate view model class.
|
@@ -0,0 +1,15 @@
|
|
1
|
+
The property's setter is run as the view model property changes.
|
2
|
+
<pre class="runnable text readonly 200">
|
3
|
+
{
|
4
|
+
module: Label,
|
5
|
+
bind: {
|
6
|
+
// Neo.component.Label.mjs has a text_ config.
|
7
|
+
// The value returned by the arrow function is assigned to label.text
|
8
|
+
text: data => \`The value of foo is "${data.foo || ''}"\`
|
9
|
+
}
|
10
|
+
}
|
11
|
+
</pre>
|
12
|
+
|
13
|
+
See <a href="http://localhost:8080/ex/model/oneway/" target="example">
|
14
|
+
examples/model/oneway/MainContainer.mjs
|
15
|
+
</a>
|