@livenetworks/ashlar 1.6.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +641 -0
- package/README.md +202 -86
- package/{js → components}/COMPONENTS.md +1116 -1108
- package/{js → components}/index.js +81 -58
- package/{js → components}/ln-accordion/README.md +7 -6
- package/components/ln-accordion/ln-accordion-dev.scss +8 -0
- package/components/ln-accordion/ln-accordion.js +1 -0
- package/components/ln-accordion/ln-accordion.schema.json +30 -0
- package/components/ln-accordion/ln-accordion.scss +8 -0
- package/{js → components}/ln-accordion/src/ln-accordion.js +8 -2
- package/{js → components}/ln-ajax/README.md +171 -160
- package/components/ln-ajax/ln-ajax-dev.scss +8 -0
- package/components/ln-ajax/ln-ajax.js +1 -0
- package/components/ln-ajax/ln-ajax.schema.json +30 -0
- package/{js → components}/ln-ajax/src/ln-ajax.js +65 -30
- package/{js → components}/ln-api-connector/README.md +27 -5
- package/components/ln-api-connector/ln-api-connector.js +1 -0
- package/components/ln-api-connector/ln-api-connector.schema.json +96 -0
- package/components/ln-api-connector/src/connector-core.js +97 -0
- package/components/ln-api-connector/src/ln-api-connector.js +447 -0
- package/{js → components}/ln-api-queue/README.md +12 -9
- package/components/ln-api-queue/ln-api-queue.js +1 -0
- package/components/ln-api-queue/ln-api-queue.schema.json +34 -0
- package/{js → components}/ln-api-queue/src/ln-api-queue.js +33 -14
- package/{js → components}/ln-api-queue/src/queue-storage.js +7 -3
- package/{js → components}/ln-autoresize/README.md +129 -127
- package/components/ln-autoresize/ln-autoresize-dev.scss +8 -0
- package/components/ln-autoresize/ln-autoresize.js +1 -0
- package/components/ln-autoresize/ln-autoresize.schema.json +22 -0
- package/{js → components}/ln-autoresize/src/ln-autoresize.js +8 -1
- package/{js → components}/ln-autosave/README.md +127 -124
- package/components/ln-autosave/ln-autosave-dev.scss +13 -0
- package/components/ln-autosave/ln-autosave.js +1 -0
- package/components/ln-autosave/ln-autosave.schema.json +48 -0
- package/components/ln-autosave/src/autosave-model.js +34 -0
- package/{js → components}/ln-autosave/src/ln-autosave.js +65 -58
- package/components/ln-chart/README.md +145 -0
- package/components/ln-chart/ln-chart-dev.scss +20 -0
- package/components/ln-chart/ln-chart.js +1 -0
- package/components/ln-chart/ln-chart.schema.json +146 -0
- package/components/ln-chart/ln-chart.scss +8 -0
- package/components/ln-chart/src/chart-model.js +154 -0
- package/components/ln-chart/src/ln-chart.js +176 -0
- package/{js → components}/ln-circular-progress/README.md +15 -14
- package/components/ln-circular-progress/ln-circular-progress-dev.scss +8 -0
- package/components/ln-circular-progress/ln-circular-progress.js +1 -0
- package/components/ln-circular-progress/ln-circular-progress.schema.json +42 -0
- package/{js → components}/ln-circular-progress/src/ln-circular-progress.js +32 -50
- package/components/ln-confirm/README.md +216 -0
- package/components/ln-confirm/ln-confirm-dev.scss +24 -0
- package/components/ln-confirm/ln-confirm.js +1 -0
- package/components/ln-confirm/ln-confirm.schema.json +66 -0
- package/components/ln-confirm/ln-confirm.scss +24 -0
- package/{js → components}/ln-confirm/src/ln-confirm.js +180 -167
- package/{js → components}/ln-core/README.md +374 -149
- package/components/ln-core/attrs.js +273 -0
- package/components/ln-core/compare.js +40 -0
- package/components/ln-core/crypto.js +265 -0
- package/components/ln-core/date.js +50 -0
- package/components/ln-core/dom.js +115 -0
- package/components/ln-core/events.js +122 -0
- package/components/ln-core/form.js +136 -0
- package/{js → components}/ln-core/hash.js +149 -92
- package/components/ln-core/helpers.js +33 -0
- package/components/ln-core/http.js +48 -0
- package/components/ln-core/index.js +11 -0
- package/components/ln-core/lifecycle.js +403 -0
- package/components/ln-core/ln-core.schema.json +109 -0
- package/components/ln-core/locale.js +55 -0
- package/components/ln-core/matching.js +78 -0
- package/components/ln-core/number.js +125 -0
- package/components/ln-core/progress.js +30 -0
- package/components/ln-core/template.js +206 -0
- package/{js → components}/ln-core/window-cache.js +247 -213
- package/{js → components}/ln-couchdb-connector/README.md +7 -5
- package/components/ln-couchdb-connector/ln-couchdb-connector.js +1 -0
- package/components/ln-couchdb-connector/ln-couchdb-connector.schema.json +50 -0
- package/{js → components}/ln-couchdb-connector/src/ln-couchdb-connector.js +29 -43
- package/{js → components}/ln-data-coordinator/README.md +109 -73
- package/components/ln-data-coordinator/ln-data-coordinator-dev.scss +8 -0
- package/components/ln-data-coordinator/ln-data-coordinator.js +1 -0
- package/components/ln-data-coordinator/ln-data-coordinator.schema.json +196 -0
- package/components/ln-data-coordinator/src/data-read-policy.js +41 -0
- package/{js → components}/ln-data-coordinator/src/ln-data-coordinator.js +411 -154
- package/{js → components}/ln-data-coordinator/src/mutation-receipts.js +0 -5
- package/{js → components}/ln-data-store/README.md +42 -17
- package/components/ln-data-store/ln-data-store-dev.scss +13 -0
- package/components/ln-data-store/ln-data-store.js +1 -0
- package/components/ln-data-store/ln-data-store.schema.json +84 -0
- package/components/ln-data-store/src/data-store-model.js +155 -0
- package/{js → components}/ln-data-store/src/ln-data-store.js +407 -105
- package/components/ln-data-store/src/window-index.js +119 -0
- package/{js → components}/ln-date/README.md +17 -7
- package/{js → components}/ln-date/ln-date-dev.scss +14 -14
- package/components/ln-date/ln-date.js +1 -0
- package/components/ln-date/ln-date.schema.json +92 -0
- package/components/ln-date/src/date-model.js +186 -0
- package/components/ln-date/src/ln-date.js +486 -0
- package/components/ln-debug/README.md +132 -0
- package/components/ln-debug/ln-debug.js +1 -0
- package/components/ln-debug/ln-debug.schema.json +28 -0
- package/components/ln-debug/src/console-sink.js +19 -0
- package/components/ln-debug/src/debug-verifier.js +331 -0
- package/components/ln-debug/src/gate.js +95 -0
- package/components/ln-debug/src/generated-attributes.js +299 -0
- package/components/ln-debug/src/ln-debug.js +60 -0
- package/{js → components}/ln-dropdown/README.md +150 -140
- package/components/ln-dropdown/ln-dropdown-dev.scss +13 -0
- package/components/ln-dropdown/ln-dropdown.js +1 -0
- package/components/ln-dropdown/ln-dropdown.schema.json +90 -0
- package/components/ln-dropdown/ln-dropdown.scss +18 -0
- package/{js → components}/ln-dropdown/src/ln-dropdown.js +114 -11
- package/{js → components}/ln-editor/README.md +11 -9
- package/components/ln-editor/ln-editor-dev.scss +18 -0
- package/components/ln-editor/ln-editor.js +1 -0
- package/components/ln-editor/ln-editor.schema.json +58 -0
- package/components/ln-editor/ln-editor.scss +13 -0
- package/{js → components}/ln-editor/src/ln-editor.js +59 -11
- package/{js → components}/ln-external-links/README.md +10 -8
- package/components/ln-external-links/ln-external-links.js +1 -0
- package/components/ln-external-links/ln-external-links.schema.json +18 -0
- package/{js → components}/ln-external-links/src/ln-external-links.js +13 -11
- package/{js → components}/ln-fill/README.md +6 -8
- package/components/ln-fill/ln-fill.js +1 -0
- package/components/ln-fill/ln-fill.schema.json +23 -0
- package/{js → components}/ln-fill/src/ln-fill.js +7 -1
- package/components/ln-filter/README.md +131 -0
- package/components/ln-filter/ln-filter-dev.scss +13 -0
- package/components/ln-filter/ln-filter.js +1 -0
- package/components/ln-filter/ln-filter.schema.json +153 -0
- package/components/ln-filter/src/filter-model.js +185 -0
- package/components/ln-filter/src/ln-filter.js +435 -0
- package/{js → components}/ln-form/README.md +260 -264
- package/components/ln-form/ln-form-dev.scss +8 -0
- package/components/ln-form/ln-form.js +1 -0
- package/components/ln-form/ln-form.schema.json +45 -0
- package/{js → components}/ln-form/src/ln-form.js +107 -99
- package/{js → components}/ln-http/README.md +11 -6
- package/components/ln-http/ln-http.js +1 -0
- package/components/ln-http/ln-http.schema.json +6 -0
- package/components/ln-http/src/http-core.js +51 -0
- package/{js → components}/ln-http/src/ln-http.js +28 -33
- package/{js → components}/ln-icon/README.md +16 -9
- package/components/ln-icon/ln-icon.schema.json +6 -0
- package/components/ln-include/README.md +75 -0
- package/components/ln-include/ln-include-dev.scss +13 -0
- package/components/ln-include/ln-include.js +1 -0
- package/components/ln-include/ln-include.schema.json +23 -0
- package/components/ln-include/src/ln-include.js +111 -0
- package/components/ln-key/README.md +130 -0
- package/components/ln-key/ln-key-dev.scss +18 -0
- package/components/ln-key/ln-key.js +1 -0
- package/components/ln-key/ln-key.schema.json +56 -0
- package/components/ln-key/src/key-model.js +146 -0
- package/components/ln-key/src/ln-key.js +201 -0
- package/{js → components}/ln-link/README.md +7 -9
- package/components/ln-link/ln-link-dev.scss +8 -0
- package/components/ln-link/ln-link.js +1 -0
- package/components/ln-link/ln-link.schema.json +22 -0
- package/{js → components}/ln-link/src/ln-link.js +16 -11
- package/components/ln-list/README.md +152 -0
- package/components/ln-list/ln-list-dev.scss +8 -0
- package/components/ln-list/ln-list.js +1 -0
- package/components/ln-list/ln-list.schema.json +166 -0
- package/components/ln-list/ln-list.scss +25 -0
- package/{js → components}/ln-list/src/ln-list.js +1301 -1216
- package/{js → components}/ln-modal/README.md +13 -10
- package/components/ln-modal/ln-modal-dev.scss +18 -0
- package/components/ln-modal/ln-modal.js +1 -0
- package/components/ln-modal/ln-modal.schema.json +54 -0
- package/components/ln-modal/ln-modal.scss +51 -0
- package/{js → components}/ln-modal/src/ln-modal.js +164 -137
- package/{js → components}/ln-nav/README.md +11 -11
- package/components/ln-nav/ln-nav.js +1 -0
- package/components/ln-nav/ln-nav.schema.json +25 -0
- package/{js → components}/ln-nav/src/ln-nav.js +25 -14
- package/components/ln-number/README.md +205 -0
- package/{js → components}/ln-number/ln-number-dev.scss +13 -13
- package/components/ln-number/ln-number.js +1 -0
- package/components/ln-number/ln-number.schema.json +63 -0
- package/components/ln-number/src/ln-number.js +400 -0
- package/components/ln-number/src/number-model.js +31 -0
- package/components/ln-obfuscator/README.md +60 -0
- package/components/ln-obfuscator/ln-obfuscator.js +1 -0
- package/components/ln-obfuscator/ln-obfuscator.schema.json +49 -0
- package/components/ln-obfuscator/src/ln-obfuscator.js +159 -0
- package/components/ln-obfuscator/src/obfuscator-model.js +250 -0
- package/{js → components}/ln-options/README.md +3 -1
- package/components/ln-options/ln-options-dev.scss +13 -0
- package/components/ln-options/ln-options.js +1 -0
- package/components/ln-options/ln-options.schema.json +41 -0
- package/{js → components}/ln-options/src/ln-options.js +13 -5
- package/components/ln-persist/README.md +151 -0
- package/components/ln-persist/ln-persist.js +1 -0
- package/components/ln-persist/ln-persist.schema.json +28 -0
- package/components/ln-persist/src/ln-persist.js +83 -0
- package/components/ln-picklist/README.md +230 -0
- package/components/ln-picklist/ln-picklist-dev.scss +22 -0
- package/components/ln-picklist/ln-picklist.js +1 -0
- package/components/ln-picklist/ln-picklist.schema.json +49 -0
- package/components/ln-picklist/src/ln-picklist.js +228 -0
- package/{js → components}/ln-popover/README.md +164 -162
- package/components/ln-popover/ln-popover-dev.scss +13 -0
- package/components/ln-popover/ln-popover.js +1 -0
- package/components/ln-popover/ln-popover.schema.json +82 -0
- package/components/ln-popover/ln-popover.scss +18 -0
- package/{js → components}/ln-popover/src/ln-popover.js +42 -36
- package/{js → components}/ln-progress/README.md +410 -413
- package/components/ln-progress/ln-progress-dev.scss +8 -0
- package/components/ln-progress/ln-progress.js +1 -0
- package/components/ln-progress/ln-progress.schema.json +40 -0
- package/components/ln-progress/src/ln-progress.js +91 -0
- package/components/ln-progress/src/progress-model.js +20 -0
- package/{js → components}/ln-router/README.md +443 -432
- package/components/ln-router/ln-router-dev.scss +13 -0
- package/components/ln-router/ln-router.js +1 -0
- package/components/ln-router/ln-router.schema.json +68 -0
- package/{js → components}/ln-router/src/ln-router.js +585 -539
- package/components/ln-router/src/router-model.js +50 -0
- package/components/ln-scroll/README.md +45 -0
- package/components/ln-scroll/ln-scroll.js +1 -0
- package/components/ln-scroll/ln-scroll.schema.json +85 -0
- package/components/ln-scroll/src/ln-scroll.js +150 -0
- package/components/ln-search/README.md +188 -0
- package/components/ln-search/ln-search-dev.scss +13 -0
- package/components/ln-search/ln-search.js +1 -0
- package/components/ln-search/ln-search.schema.json +103 -0
- package/components/ln-search/src/ln-search.js +330 -0
- package/{js → components}/ln-slug/README.md +6 -3
- package/components/ln-slug/ln-slug-dev.scss +18 -0
- package/components/ln-slug/ln-slug.js +1 -0
- package/components/ln-slug/ln-slug.schema.json +23 -0
- package/{js → components}/ln-slug/src/ln-slug.js +20 -13
- package/components/ln-slug/src/slug-model.js +21 -0
- package/{js → components}/ln-sort/README.md +178 -170
- package/{js → components}/ln-sort/ln-sort-dev.scss +8 -8
- package/components/ln-sort/ln-sort.js +1 -0
- package/components/ln-sort/ln-sort.schema.json +104 -0
- package/components/ln-sort/src/ln-sort.js +321 -0
- package/components/ln-sort/src/sort-model.js +117 -0
- package/{js → components}/ln-sortable/README.md +7 -11
- package/components/ln-sortable/ln-sortable-dev.scss +13 -0
- package/components/ln-sortable/ln-sortable.js +1 -0
- package/components/ln-sortable/ln-sortable.schema.json +36 -0
- package/{js → components}/ln-sortable/src/ln-sortable.js +8 -13
- package/{js → components}/ln-stat/README.md +3 -1
- package/components/ln-stat/ln-stat-dev.scss +8 -0
- package/components/ln-stat/ln-stat.js +1 -0
- package/components/ln-stat/ln-stat.schema.json +32 -0
- package/{js → components}/ln-stat/src/ln-stat.js +14 -18
- package/components/ln-stat/src/stat-model.js +28 -0
- package/{js → components}/ln-table/README.md +37 -24
- package/{js → components}/ln-table/ln-table-dev.scss +17 -17
- package/components/ln-table/ln-table.js +1 -0
- package/components/ln-table/ln-table.schema.json +211 -0
- package/components/ln-table/ln-table.scss +15 -0
- package/{js → components}/ln-table/src/ln-table.js +1365 -1493
- package/components/ln-table/src/table-model.js +98 -0
- package/components/ln-table-coordinator/README.md +61 -0
- package/components/ln-table-coordinator/ln-table-coordinator.js +1 -0
- package/components/ln-table-coordinator/ln-table-coordinator.schema.json +93 -0
- package/components/ln-table-coordinator/src/ln-table-coordinator.js +193 -0
- package/{js → components}/ln-tabs/README.md +32 -14
- package/components/ln-tabs/ln-tabs-dev.scss +24 -0
- package/components/ln-tabs/ln-tabs.js +1 -0
- package/components/ln-tabs/ln-tabs.schema.json +75 -0
- package/components/ln-tabs/ln-tabs.scss +8 -0
- package/components/ln-tabs/src/ln-tabs.js +207 -0
- package/components/ln-tabs/src/tabs-model.js +82 -0
- package/{js → components}/ln-time/README.md +96 -95
- package/components/ln-time/ln-time-dev.scss +13 -0
- package/components/ln-time/ln-time.js +1 -0
- package/components/ln-time/ln-time.schema.json +38 -0
- package/{js → components}/ln-time/src/ln-time.js +206 -223
- package/components/ln-time/src/time-model.js +64 -0
- package/{js → components}/ln-toast/README.md +23 -5
- package/components/ln-toast/ln-toast-dev.scss +8 -0
- package/components/ln-toast/ln-toast.js +1 -0
- package/components/ln-toast/ln-toast.schema.json +65 -0
- package/components/ln-toast/ln-toast.scss +59 -0
- package/{js → components}/ln-toast/src/ln-toast.js +233 -232
- package/{js → components}/ln-toggle/README.md +198 -196
- package/{js → components}/ln-toggle/ln-toggle-dev.scss +13 -13
- package/components/ln-toggle/ln-toggle.js +1 -0
- package/components/ln-toggle/ln-toggle.schema.json +52 -0
- package/components/ln-toggle/ln-toggle.scss +37 -0
- package/{js → components}/ln-toggle/src/ln-toggle.js +61 -46
- package/{js → components}/ln-tooltip/README.md +6 -6
- package/{js → components}/ln-tooltip/ln-tooltip-dev.scss +9 -9
- package/components/ln-tooltip/ln-tooltip.js +1 -0
- package/components/ln-tooltip/ln-tooltip.schema.json +86 -0
- package/components/ln-tooltip/ln-tooltip.scss +9 -0
- package/{js → components}/ln-tooltip/src/ln-tooltip.js +14 -3
- package/{js → components}/ln-translations/README.md +3 -1
- package/components/ln-translations/ln-translations-dev.scss +13 -0
- package/components/ln-translations/ln-translations.js +1 -0
- package/components/ln-translations/ln-translations.schema.json +120 -0
- package/{js → components}/ln-translations/src/ln-translations.js +25 -10
- package/components/ln-ui-coordinator/README.md +101 -0
- package/components/ln-ui-coordinator/ln-ui-coordinator-dev.scss +8 -0
- package/components/ln-ui-coordinator/ln-ui-coordinator.js +1 -0
- package/components/ln-ui-coordinator/ln-ui-coordinator.schema.json +60 -0
- package/{js/ln-modal-coordinator/src/ln-modal-coordinator.js → components/ln-ui-coordinator/src/ln-ui-coordinator.js} +403 -345
- package/components/ln-upload/README.md +133 -0
- package/components/ln-upload/ln-upload-dev.scss +18 -0
- package/components/ln-upload/ln-upload.js +1 -0
- package/components/ln-upload/ln-upload.schema.json +193 -0
- package/components/ln-upload/ln-upload.scss +20 -0
- package/components/ln-upload/src/ln-upload.js +652 -0
- package/components/ln-upload/src/upload-model.js +78 -0
- package/{js → components}/ln-validate/README.md +182 -180
- package/{js → components}/ln-validate/ln-validate-dev.scss +15 -15
- package/components/ln-validate/ln-validate.js +1 -0
- package/components/ln-validate/ln-validate.schema.json +50 -0
- package/components/ln-validate/ln-validate.scss +7 -0
- package/{js → components}/ln-validate/src/ln-validate.js +23 -45
- package/components/ln-validate/src/validate-model.js +64 -0
- package/components/ln-websocket-connector/README.md +166 -0
- package/components/ln-websocket-connector/ln-websocket-connector.js +1 -0
- package/components/ln-websocket-connector/ln-websocket-connector.schema.json +29 -0
- package/components/ln-websocket-connector/src/ln-websocket-connector.js +279 -0
- package/ln-ashlar.html-data.json +1796 -0
- package/package.json +84 -61
- package/{scss → theme}/base/_global.scss +1 -2
- package/{scss → theme}/base/_reset.scss +1 -1
- package/{scss → theme}/base/_typography.scss +2 -0
- package/theme/brand.css +73 -0
- package/{scss → theme}/components/_app-shell.scss +8 -0
- package/theme/components/_button.scss +24 -0
- package/theme/components/_chart.scss +5 -0
- package/theme/components/_confirm.scss +6 -0
- package/{scss → theme}/components/_date.scss +30 -22
- package/{scss → theme}/components/_dropdown.scss +6 -1
- package/theme/components/_form.scss +140 -0
- package/{scss → theme}/components/_layout.scss +6 -0
- package/{scss → theme}/components/_ln-table.scss +1 -6
- package/theme/components/_picklist.scss +3 -0
- package/{scss → theme}/components/_sort.scss +10 -10
- package/theme/components/_status-badge.scss +6 -0
- package/{scss → theme}/components/_table.scss +16 -0
- package/{scss → theme}/components/_tabs.scss +0 -4
- package/theme/components/_toast.scss +48 -0
- package/{scss → theme}/components/_toggle.scss +1 -1
- package/theme/components/_upload.scss +45 -0
- package/{scss → theme}/config/_breakpoints.scss +1 -1
- package/theme/config/_contrast.scss +128 -0
- package/{scss → theme}/config/_density.scss +191 -205
- package/theme/config/_palette.scss +274 -0
- package/theme/config/_theme.scss +293 -0
- package/{scss → theme}/config/_tokens.scss +285 -441
- package/{scss → theme}/config/mixins/_accordion.scss +1 -1
- package/{scss → theme}/config/mixins/_alert.scss +1 -0
- package/{scss → theme}/config/mixins/_app-shell.scss +4 -2
- package/{scss → theme}/config/mixins/_borders.scss +2 -0
- package/theme/config/mixins/_btn.scss +175 -0
- package/{scss → theme}/config/mixins/_card.scss +55 -46
- package/theme/config/mixins/_chart.scss +82 -0
- package/{scss → theme}/config/mixins/_collapsible.scss +2 -1
- package/{scss → theme}/config/mixins/_colors.scss +8 -14
- package/{scss → theme}/config/mixins/_diagnostics.scss +48 -48
- package/theme/config/mixins/_dropdown.scss +169 -0
- package/{scss → theme}/config/mixins/_editor.scss +0 -7
- package/{scss → theme}/config/mixins/_filter.scss +47 -47
- package/{scss → theme}/config/mixins/_footer.scss +1 -1
- package/{scss → theme}/config/mixins/_form.scss +49 -18
- package/{scss → theme}/config/mixins/_index.scss +62 -61
- package/{scss → theme}/config/mixins/_layout.scss +6 -2
- package/{scss → theme}/config/mixins/_ln-table.scss +31 -10
- package/{scss → theme}/config/mixins/_loader.scss +1 -1
- package/{scss → theme}/config/mixins/_modal.scss +145 -149
- package/{scss → theme}/config/mixins/_motion.scss +13 -0
- package/{scss → theme}/config/mixins/_nav.scss +7 -7
- package/theme/config/mixins/_picklist.scss +66 -0
- package/theme/config/mixins/_popover.scss +96 -0
- package/{scss → theme}/config/mixins/_sidebar.scss +7 -4
- package/{scss → theme}/config/mixins/_sort.scss +43 -42
- package/{scss → theme}/config/mixins/_status-badge.scss +15 -2
- package/{scss → theme}/config/mixins/_table.scss +25 -14
- package/{scss → theme}/config/mixins/_tabs.scss +1 -1
- package/{scss → theme}/config/mixins/_toast.scss +174 -179
- package/{scss → theme}/config/mixins/_tooltip.scss +2 -2
- package/{scss → theme}/config/mixins/_typography.scss +16 -5
- package/{scss → theme}/config/mixins/_upload.scss +8 -6
- package/theme/ln-ashlar-core.scss +24 -0
- package/theme/ln-ashlar-dev.scss +66 -0
- package/theme/ln-ashlar-landing.scss +56 -0
- package/{scss/ln-ashlar.scss → theme/ln-ashlar-theme.scss} +63 -69
- package/theme/ln-ashlar.scss +8 -0
- package/theme/presentation/_bento.scss +151 -0
- package/theme/presentation/_cta.scss +111 -0
- package/theme/presentation/_effects.scss +216 -0
- package/theme/presentation/_features.scss +108 -0
- package/theme/presentation/_footer.scss +129 -0
- package/theme/presentation/_hero.scss +158 -0
- package/theme/presentation/_layout.scss +170 -0
- package/theme/presentation/_navbar.scss +140 -0
- package/theme/presentation/_pricing.scss +262 -0
- package/theme/presentation/_stats.scss +87 -0
- package/theme/presentation/_testimonials.scss +124 -0
- package/theme/presentation/_tokens.scss +39 -0
- package/theme/presentation/_typography.scss +163 -0
- package/{scss → theme}/utilities/_animations.scss +38 -0
- package/{scss → theme}/utilities/_utilities.scss +6 -0
- package/web-types.json +2312 -0
- package/js/ln-accordion/ln-accordion.js +0 -1
- package/js/ln-ajax/ln-ajax.js +0 -1
- package/js/ln-api-connector/ln-api-connector.js +0 -1
- package/js/ln-api-connector/src/ln-api-connector.js +0 -368
- package/js/ln-api-queue/ln-api-queue.js +0 -1
- package/js/ln-autoresize/ln-autoresize.js +0 -1
- package/js/ln-autosave/ln-autosave.js +0 -1
- package/js/ln-circular-progress/ln-circular-progress.js +0 -1
- package/js/ln-confirm/README.md +0 -162
- package/js/ln-confirm/_ln-confirm.scss +0 -24
- package/js/ln-confirm/ln-confirm.js +0 -1
- package/js/ln-core/crypto.js +0 -83
- package/js/ln-core/helpers.js +0 -788
- package/js/ln-core/index.js +0 -7
- package/js/ln-core/persist.js +0 -97
- package/js/ln-couchdb-connector/ln-couchdb-connector.js +0 -1
- package/js/ln-data-coordinator/ln-data-coordinator.js +0 -1
- package/js/ln-data-coordinator/src/data-read-policy.js +0 -18
- package/js/ln-data-store/ln-data-store.js +0 -1
- package/js/ln-date/ln-date.js +0 -1
- package/js/ln-date/src/ln-date.js +0 -603
- package/js/ln-debug/README.md +0 -58
- package/js/ln-debug/ln-debug.js +0 -1
- package/js/ln-debug/src/ln-debug.js +0 -19
- package/js/ln-dropdown/ln-dropdown.js +0 -1
- package/js/ln-dropdown/ln-dropdown.scss +0 -15
- package/js/ln-editor/ln-editor.js +0 -1
- package/js/ln-editor/ln-editor.scss +0 -43
- package/js/ln-external-links/ln-external-links.js +0 -1
- package/js/ln-fill/ln-fill.js +0 -1
- package/js/ln-filter/README.md +0 -189
- package/js/ln-filter/ln-filter-dev.scss +0 -8
- package/js/ln-filter/ln-filter.js +0 -1
- package/js/ln-filter/src/ln-filter.js +0 -419
- package/js/ln-form/ln-form.js +0 -1
- package/js/ln-http/ln-http.js +0 -1
- package/js/ln-link/ln-link.js +0 -1
- package/js/ln-list/README.md +0 -129
- package/js/ln-list/ln-list.js +0 -1
- package/js/ln-list/ln-list.scss +0 -28
- package/js/ln-modal/ln-modal-dev.scss +0 -13
- package/js/ln-modal/ln-modal.js +0 -1
- package/js/ln-modal/ln-modal.scss +0 -35
- package/js/ln-modal-coordinator/README.md +0 -99
- package/js/ln-modal-coordinator/ln-modal-coordinator-dev.scss +0 -8
- package/js/ln-modal-coordinator/ln-modal-coordinator.js +0 -1
- package/js/ln-nav/ln-nav.js +0 -1
- package/js/ln-number/README.md +0 -149
- package/js/ln-number/ln-number.js +0 -1
- package/js/ln-number/src/ln-number.js +0 -443
- package/js/ln-options/ln-options.js +0 -1
- package/js/ln-popover/ln-popover.js +0 -1
- package/js/ln-progress/ln-progress.js +0 -1
- package/js/ln-progress/src/ln-progress.js +0 -98
- package/js/ln-router/ln-router.js +0 -1
- package/js/ln-search/README.md +0 -158
- package/js/ln-search/ln-search-dev.scss +0 -8
- package/js/ln-search/ln-search.js +0 -1
- package/js/ln-search/src/ln-search.js +0 -117
- package/js/ln-slug/ln-slug.js +0 -1
- package/js/ln-sort/ln-sort.js +0 -1
- package/js/ln-sort/src/ln-sort.js +0 -178
- package/js/ln-sortable/ln-sortable.js +0 -1
- package/js/ln-stat/ln-stat.js +0 -1
- package/js/ln-table/ln-table.js +0 -1
- package/js/ln-table/ln-table.scss +0 -11
- package/js/ln-table-coordinator/README.md +0 -73
- package/js/ln-table-coordinator/ln-table-coordinator.js +0 -1
- package/js/ln-table-coordinator/src/ln-table-coordinator.js +0 -160
- package/js/ln-tabs/ln-tabs-dev.scss +0 -18
- package/js/ln-tabs/ln-tabs.js +0 -1
- package/js/ln-tabs/src/ln-tabs.js +0 -188
- package/js/ln-time/ln-time.js +0 -1
- package/js/ln-toast/ln-toast.js +0 -1
- package/js/ln-toggle/ln-toggle.js +0 -1
- package/js/ln-tooltip/ln-tooltip.js +0 -1
- package/js/ln-tooltip/ln-tooltip.scss +0 -9
- package/js/ln-translations/ln-translations.js +0 -1
- package/js/ln-upload/README.md +0 -255
- package/js/ln-upload/ln-upload.js +0 -1
- package/js/ln-upload/ln-upload.scss +0 -20
- package/js/ln-upload/src/ln-upload.js +0 -423
- package/js/ln-validate/ln-validate.js +0 -1
- package/scss/components/_button.scss +0 -20
- package/scss/components/_confirm.scss +0 -5
- package/scss/components/_form.scss +0 -107
- package/scss/components/_status-badge.scss +0 -4
- package/scss/components/_toast.scss +0 -68
- package/scss/components/_upload.scss +0 -51
- package/scss/config/_theme.scss +0 -216
- package/scss/config/mixins/_btn.scss +0 -179
- package/scss/config/mixins/_confirm.scss +0 -31
- package/scss/config/mixins/_dropdown.scss +0 -141
- package/scss/config/mixins/_popover.scss +0 -64
- package/scss/ln-ashlar-dev.scss +0 -39
- /package/{js → components}/ln-core/positioning.js +0 -0
- /package/{js → components}/ln-core/reactive.js +0 -0
- /package/{js → components}/ln-filter/ln-filter.scss +0 -0
- /package/{js → components}/ln-icon/ln-icon.js +0 -0
- /package/{js → components}/ln-icon/src/ln-icon.js +0 -0
- /package/{js → components}/ln-search/ln-search.scss +0 -0
- /package/{js → components}/ln-toast/template.html +0 -0
- /package/{scss → theme}/components/_accordion.scss +0 -0
- /package/{scss → theme}/components/_ajax.scss +0 -0
- /package/{scss → theme}/components/_alert.scss +0 -0
- /package/{scss → theme}/components/_avatar.scss +0 -0
- /package/{scss → theme}/components/_breadcrumbs.scss +0 -0
- /package/{scss → theme}/components/_card.scss +0 -0
- /package/{scss → theme}/components/_chip.scss +0 -0
- /package/{scss → theme}/components/_circular-progress.scss +0 -0
- /package/{scss → theme}/components/_editor.scss +0 -0
- /package/{scss → theme}/components/_empty-state.scss +0 -0
- /package/{scss → theme}/components/_filter.scss +0 -0
- /package/{scss → theme}/components/_link.scss +0 -0
- /package/{scss → theme}/components/_loader.scss +0 -0
- /package/{scss → theme}/components/_modal.scss +0 -0
- /package/{scss → theme}/components/_nav.scss +0 -0
- /package/{scss → theme}/components/_page-header.scss +0 -0
- /package/{scss → theme}/components/_popover.scss +0 -0
- /package/{scss → theme}/components/_progress.scss +0 -0
- /package/{scss → theme}/components/_prose.scss +0 -0
- /package/{scss → theme}/components/_scrollbar.scss +0 -0
- /package/{scss → theme}/components/_sections.scss +0 -0
- /package/{scss → theme}/components/_sidebar.scss +0 -0
- /package/{scss → theme}/components/_stat-card.scss +0 -0
- /package/{scss → theme}/components/_stepper.scss +0 -0
- /package/{scss → theme}/components/_timeline.scss +0 -0
- /package/{scss → theme}/components/_tooltip.scss +0 -0
- /package/{scss → theme}/components/_translations.scss +0 -0
- /package/{scss → theme}/config/_icons.scss +0 -0
- /package/{scss → theme}/config/_mixins.scss +0 -0
- /package/{scss → theme}/config/mixins/_ajax.scss +0 -0
- /package/{scss → theme}/config/mixins/_avatar.scss +0 -0
- /package/{scss → theme}/config/mixins/_breadcrumbs.scss +0 -0
- /package/{scss → theme}/config/mixins/_breakpoints.scss +0 -0
- /package/{scss → theme}/config/mixins/_chip.scss +0 -0
- /package/{scss → theme}/config/mixins/_circular-progress.scss +0 -0
- /package/{scss → theme}/config/mixins/_display.scss +0 -0
- /package/{scss → theme}/config/mixins/_empty-state.scss +0 -0
- /package/{scss → theme}/config/mixins/_focus.scss +0 -0
- /package/{scss → theme}/config/mixins/_interaction.scss +0 -0
- /package/{scss → theme}/config/mixins/_kbd.scss +0 -0
- /package/{scss → theme}/config/mixins/_link.scss +0 -0
- /package/{scss → theme}/config/mixins/_page-header.scss +0 -0
- /package/{scss → theme}/config/mixins/_position.scss +0 -0
- /package/{scss → theme}/config/mixins/_progress.scss +0 -0
- /package/{scss → theme}/config/mixins/_prose.scss +0 -0
- /package/{scss → theme}/config/mixins/_shadows.scss +0 -0
- /package/{scss → theme}/config/mixins/_sizing.scss +0 -0
- /package/{scss → theme}/config/mixins/_spacing.scss +0 -0
- /package/{scss → theme}/config/mixins/_stat-card.scss +0 -0
- /package/{scss → theme}/config/mixins/_stepper.scss +0 -0
- /package/{scss → theme}/config/mixins/_timeline.scss +0 -0
- /package/{scss → theme}/config/mixins/_transitions.scss +0 -0
- /package/{scss → theme}/config/mixins/_translations.scss +0 -0
- /package/{scss → theme}/tabler-icons.txt +0 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
// ─── Guard Body ────────────────────────────────────────
|
|
2
|
+
|
|
3
|
+
export function guardBody(setupFn, componentTag) {
|
|
4
|
+
if (!document.body) {
|
|
5
|
+
document.addEventListener('DOMContentLoaded', function () {
|
|
6
|
+
guardBody(setupFn, componentTag);
|
|
7
|
+
});
|
|
8
|
+
console.warn('[' + componentTag + '] Script loaded before <body> — add "defer" to your <script> tag');
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
setupFn();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// ─── Visibility Check ─────────────────────────────────────
|
|
15
|
+
|
|
16
|
+
export function isVisible(el) {
|
|
17
|
+
return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Determines whether a mouse click event should be ignored (modified click or non-primary button).
|
|
22
|
+
* @param {MouseEvent|Object} [event]
|
|
23
|
+
* @returns {boolean}
|
|
24
|
+
*/
|
|
25
|
+
export function shouldIgnoreClick(event) {
|
|
26
|
+
if (!event) return true;
|
|
27
|
+
if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return true;
|
|
28
|
+
if (typeof event.button === 'number' && event.button !== 0) return true;
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Checks if a target element is an active editable field or contenteditable element.
|
|
34
|
+
* @param {Element|Object} [target]
|
|
35
|
+
* @returns {boolean}
|
|
36
|
+
*/
|
|
37
|
+
export function isEditableTarget(target) {
|
|
38
|
+
if (!target) return false;
|
|
39
|
+
if (typeof target.closest === 'function') {
|
|
40
|
+
return Boolean(target.closest('input, textarea, select, [contenteditable]:not([contenteditable="false"])'));
|
|
41
|
+
}
|
|
42
|
+
const tag = String(target.tagName || '').toLowerCase();
|
|
43
|
+
return tag === 'input' || tag === 'textarea' || tag === 'select' || Boolean(target.isContentEditable);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Checks if a target element is disabled, aria-disabled, or inside an inert container.
|
|
48
|
+
* @param {Element|Object} [target]
|
|
49
|
+
* @returns {boolean}
|
|
50
|
+
*/
|
|
51
|
+
export function isTargetDisabled(target) {
|
|
52
|
+
if (!target) return true;
|
|
53
|
+
if (target.disabled || (typeof target.getAttribute === 'function' && target.getAttribute('aria-disabled') === 'true')) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
if (typeof target.closest === 'function' && target.closest('[inert]')) {
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Checks if a target element is connected, enabled, not inert, visible, and optionally supports an action method.
|
|
64
|
+
* @param {Element} target
|
|
65
|
+
* @param {string} [action]
|
|
66
|
+
* @returns {boolean}
|
|
67
|
+
*/
|
|
68
|
+
export function isUsableTarget(target, action) {
|
|
69
|
+
if (!target || !document.contains(target)) return false;
|
|
70
|
+
if (isTargetDisabled(target)) return false;
|
|
71
|
+
if (action && typeof target[action] !== 'function') return false;
|
|
72
|
+
return isVisible(target);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Checks if a link click should be intercepted by client-side routing.
|
|
77
|
+
* Must be standard navigation click (left button, no modifiers), same origin,
|
|
78
|
+
* not mailto/tel, and not pure hash/empty.
|
|
79
|
+
*
|
|
80
|
+
* @param {MouseEvent} event
|
|
81
|
+
* @param {HTMLAnchorElement} anchor
|
|
82
|
+
* @returns {boolean}
|
|
83
|
+
*/
|
|
84
|
+
export function shouldInterceptLink(event, anchor) {
|
|
85
|
+
if (event.ctrlKey || event.metaKey || event.shiftKey || event.altKey || event.button !== 0) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
if (!anchor) return false;
|
|
89
|
+
const href = anchor.getAttribute('href');
|
|
90
|
+
if (!href) return false;
|
|
91
|
+
if (anchor.getAttribute('target') === '_blank') return false;
|
|
92
|
+
if (anchor.hasAttribute('download')) return false;
|
|
93
|
+
if (href.startsWith('mailto:') || href.startsWith('tel:')) return false;
|
|
94
|
+
if (href === '#' || href.startsWith('#')) return false;
|
|
95
|
+
if (anchor.hostname && anchor.hostname !== window.location.hostname) return false;
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Read the raw machine value behind a formatted cell/item display.
|
|
101
|
+
* Returns the `data-ln-value` attribute if present, else trimmed textContent.
|
|
102
|
+
* Single read path for value-based sort/filter across components.
|
|
103
|
+
*/
|
|
104
|
+
export function readValue(el) {
|
|
105
|
+
if (el.hasAttribute('data-ln-value')) {
|
|
106
|
+
return el.getAttribute('data-ln-value');
|
|
107
|
+
}
|
|
108
|
+
if (el.tagName === 'TIME' && el.hasAttribute('datetime')) {
|
|
109
|
+
return el.getAttribute('datetime');
|
|
110
|
+
}
|
|
111
|
+
if (el.tagName === 'DATA' && el.hasAttribute('value')) {
|
|
112
|
+
return el.getAttribute('value');
|
|
113
|
+
}
|
|
114
|
+
return el.textContent.trim();
|
|
115
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// ─── Environment & Debug Gates ─────────────────────────────
|
|
2
|
+
|
|
3
|
+
export function hasActiveDebug() {
|
|
4
|
+
if (typeof window === 'undefined') return false;
|
|
5
|
+
if (window.lnDebug === true) return true;
|
|
6
|
+
if (window.lnCore && window.lnCore._debugSink) return true;
|
|
7
|
+
if (typeof document !== 'undefined' && document.body) {
|
|
8
|
+
return document.body.hasAttribute('data-ln-debug') || document.body.querySelector('[data-ln-debug]') !== null;
|
|
9
|
+
}
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function isDevMode(el) {
|
|
14
|
+
if (typeof window === 'undefined') return false;
|
|
15
|
+
if (window.lnDebug === true) return true;
|
|
16
|
+
|
|
17
|
+
// Authoritative gate check when ln-debug is active
|
|
18
|
+
if (window.lnCore && window.lnCore._debugIsContained) {
|
|
19
|
+
if (el) return window.lnCore._debugIsContained(el);
|
|
20
|
+
return window.lnCore._debugSink !== null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Direct DOM containment fallback (e.g. standalone tests or before gate boots)
|
|
24
|
+
if (el && el.closest) {
|
|
25
|
+
const host = el.closest('[data-ln-debug]');
|
|
26
|
+
if (!host || (typeof document !== 'undefined' && host === document.documentElement)) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
if (typeof document !== 'undefined' && document.body) {
|
|
32
|
+
return document.body.hasAttribute('data-ln-debug');
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// ─── Global Console Warning Interceptor (Production Mode) ──
|
|
38
|
+
if (typeof window !== 'undefined') {
|
|
39
|
+
window.lnCore = window.lnCore || {};
|
|
40
|
+
if (!window.lnCore._warnBound) {
|
|
41
|
+
window.lnCore._warnBound = true;
|
|
42
|
+
const originalWarn = console.warn;
|
|
43
|
+
console.warn = function (...args) {
|
|
44
|
+
const isLibraryWarning = typeof args[0] === 'string' &&
|
|
45
|
+
(args[0].startsWith('[ln-') || args[0].startsWith('[lnCore'));
|
|
46
|
+
|
|
47
|
+
if (isLibraryWarning) {
|
|
48
|
+
let el = null;
|
|
49
|
+
for (let i = 1; i < args.length; i++) {
|
|
50
|
+
if (args[i] && args[i].nodeType === 1) {
|
|
51
|
+
el = args[i];
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (!isDevMode(el)) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
originalWarn.apply(console, args);
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// ─── Event Dispatch & Sinks ────────────────────────────────
|
|
65
|
+
|
|
66
|
+
// Nullable console-observation sink. Installed/removed only by ln-debug's
|
|
67
|
+
// gate (components/ln-debug/src/gate.js). window.lnCore is guaranteed already
|
|
68
|
+
// initialized by the module-load-time block above (_warnBound),
|
|
69
|
+
// so the hot-path read needs no defensive "window.lnCore &&" guard.
|
|
70
|
+
export function setDebugSink(sink, isContained) {
|
|
71
|
+
window.lnCore = window.lnCore || {};
|
|
72
|
+
window.lnCore._debugSink = sink;
|
|
73
|
+
window.lnCore._debugIsContained = isContained || null;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Nullable persist restore/save sink. Installed/removed only by ln-persist
|
|
77
|
+
// (components/ln-persist/src/ln-persist.js) — mirrors setDebugSink exactly.
|
|
78
|
+
export function setPersistSink(sink) {
|
|
79
|
+
window.lnCore = window.lnCore || {};
|
|
80
|
+
window.lnCore._persistSink = sink;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function dispatch(element, eventName, detail) {
|
|
84
|
+
const payload = detail || {};
|
|
85
|
+
if (window.lnCore._debugSink) window.lnCore._debugSink('event', eventName, element, payload);
|
|
86
|
+
element.dispatchEvent(new CustomEvent(eventName, {
|
|
87
|
+
bubbles: true,
|
|
88
|
+
detail: payload
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export function dispatchCancelable(element, eventName, detail) {
|
|
93
|
+
const payload = detail || {};
|
|
94
|
+
if (window.lnCore._debugSink) window.lnCore._debugSink('event', eventName, element, payload);
|
|
95
|
+
const event = new CustomEvent(eventName, {
|
|
96
|
+
bubbles: true,
|
|
97
|
+
cancelable: true,
|
|
98
|
+
detail: payload
|
|
99
|
+
});
|
|
100
|
+
element.dispatchEvent(event);
|
|
101
|
+
return event;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Re-filter / re-sort / re-render a data-driven list-like component, then
|
|
106
|
+
* notify the coordinator that fresh data is requested.
|
|
107
|
+
*/
|
|
108
|
+
export function requestData(component, eventName, keyName) {
|
|
109
|
+
component._applyFilterAndSort();
|
|
110
|
+
component._vStart = -1;
|
|
111
|
+
component._vEnd = -1;
|
|
112
|
+
component._render();
|
|
113
|
+
component._updateFooter();
|
|
114
|
+
|
|
115
|
+
const detail = {
|
|
116
|
+
sort: component.currentSort,
|
|
117
|
+
filters: component.currentFilters,
|
|
118
|
+
search: component.currentSearch
|
|
119
|
+
};
|
|
120
|
+
detail[keyName] = component.name;
|
|
121
|
+
dispatch(component.dom, eventName, detail);
|
|
122
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
// ─── Form Method Resolution ────────────────────────────────
|
|
2
|
+
|
|
3
|
+
export function resolveFormMethod(form) {
|
|
4
|
+
const methodInput = form.querySelector('input[name="_method"]');
|
|
5
|
+
const raw = (methodInput && methodInput.value !== '') ? methodInput.value : form.method;
|
|
6
|
+
return (raw || '').toUpperCase();
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// ─── Form Serialization ───────────────────────────────────
|
|
10
|
+
|
|
11
|
+
export function serializeForm(form, opts) {
|
|
12
|
+
const typed = !!(opts && opts.typed);
|
|
13
|
+
const exclude = opts && opts.exclude;
|
|
14
|
+
const data = {};
|
|
15
|
+
const elements = form.elements;
|
|
16
|
+
|
|
17
|
+
const checkboxCounts = {};
|
|
18
|
+
if (typed) {
|
|
19
|
+
for (let i = 0; i < elements.length; i++) {
|
|
20
|
+
const el = elements[i];
|
|
21
|
+
if (el.name && el.type === 'checkbox' && !el.disabled) {
|
|
22
|
+
checkboxCounts[el.name] = (checkboxCounts[el.name] || 0) + 1;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
for (let i = 0; i < elements.length; i++) {
|
|
28
|
+
const el = elements[i];
|
|
29
|
+
if (!el.name || el.disabled || el.type === 'file' || el.type === 'submit' || el.type === 'button') continue;
|
|
30
|
+
if (exclude && el.matches && el.matches(exclude)) continue;
|
|
31
|
+
|
|
32
|
+
if (el.type === 'checkbox') {
|
|
33
|
+
if (typed && checkboxCounts[el.name] === 1) {
|
|
34
|
+
data[el.name] = el.checked;
|
|
35
|
+
} else {
|
|
36
|
+
if (!data[el.name]) data[el.name] = [];
|
|
37
|
+
if (el.checked) data[el.name].push(el.value);
|
|
38
|
+
}
|
|
39
|
+
} else if (el.type === 'radio') {
|
|
40
|
+
if (el.checked) data[el.name] = el.value;
|
|
41
|
+
} else if (el.type === 'select-multiple') {
|
|
42
|
+
data[el.name] = [];
|
|
43
|
+
for (let j = 0; j < el.options.length; j++) {
|
|
44
|
+
if (el.options[j].selected) data[el.name].push(el.options[j].value);
|
|
45
|
+
}
|
|
46
|
+
} else if (typed && el.type === 'hidden') {
|
|
47
|
+
data[el.name] = el.value;
|
|
48
|
+
} else if (typed && (el.type === 'number' || el.type === 'range')) {
|
|
49
|
+
const n = Number(el.value);
|
|
50
|
+
data[el.name] = (el.value === '' || isNaN(n)) ? null : n;
|
|
51
|
+
} else {
|
|
52
|
+
data[el.name] = el.value;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return data;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ─── Form Population ──────────────────────────────────────
|
|
60
|
+
|
|
61
|
+
function _coerceBool(value) {
|
|
62
|
+
if (typeof value !== 'string') return !!value;
|
|
63
|
+
const v = value.trim().toLowerCase();
|
|
64
|
+
return v !== 'false' && v !== '0' && v !== '' && v !== 'off' && v !== 'no';
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export function populateForm(form, data) {
|
|
68
|
+
const elements = form.elements;
|
|
69
|
+
const filled = [];
|
|
70
|
+
|
|
71
|
+
const checkboxCounts = {};
|
|
72
|
+
for (let i = 0; i < elements.length; i++) {
|
|
73
|
+
const el = elements[i];
|
|
74
|
+
if (el.name && el.type === 'checkbox') {
|
|
75
|
+
checkboxCounts[el.name] = (checkboxCounts[el.name] || 0) + 1;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
for (let i = 0; i < elements.length; i++) {
|
|
80
|
+
const el = elements[i];
|
|
81
|
+
if (el.type === 'file' || el.type === 'submit' || el.type === 'button') continue;
|
|
82
|
+
|
|
83
|
+
const matchKey = el.getAttribute('data-ln-fill-as') || el.name;
|
|
84
|
+
if (!matchKey || !(matchKey in data)) continue;
|
|
85
|
+
|
|
86
|
+
const value = data[matchKey];
|
|
87
|
+
|
|
88
|
+
if (el.type === 'checkbox') {
|
|
89
|
+
if (Array.isArray(value)) {
|
|
90
|
+
el.checked = value.indexOf(el.value) !== -1;
|
|
91
|
+
} else if (checkboxCounts[el.name] > 1) {
|
|
92
|
+
const list = String(value).split(',').map(function (s) { return s.trim(); });
|
|
93
|
+
el.checked = list.indexOf(el.value) !== -1;
|
|
94
|
+
} else {
|
|
95
|
+
el.checked = _coerceBool(value);
|
|
96
|
+
}
|
|
97
|
+
filled.push(el);
|
|
98
|
+
} else if (el.type === 'radio') {
|
|
99
|
+
el.checked = el.value === String(value);
|
|
100
|
+
filled.push(el);
|
|
101
|
+
} else if (el.type === 'select-multiple') {
|
|
102
|
+
if (Array.isArray(value)) {
|
|
103
|
+
for (let j = 0; j < el.options.length; j++) {
|
|
104
|
+
el.options[j].selected = value.indexOf(el.options[j].value) !== -1;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
filled.push(el);
|
|
108
|
+
} else {
|
|
109
|
+
el.value = value;
|
|
110
|
+
filled.push(el);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return filled;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// ─── Value Property Interception ───────────────────────────
|
|
118
|
+
|
|
119
|
+
export function interceptValueProperty(dom, descriptor, { get, set }) {
|
|
120
|
+
Object.defineProperty(dom, 'value', {
|
|
121
|
+
get: function () {
|
|
122
|
+
if (get) {
|
|
123
|
+
return get.call(this);
|
|
124
|
+
}
|
|
125
|
+
return descriptor.get.call(this);
|
|
126
|
+
},
|
|
127
|
+
set: function (val) {
|
|
128
|
+
if (set) {
|
|
129
|
+
set.call(this, val, (originalVal) => descriptor.set.call(this, originalVal));
|
|
130
|
+
} else {
|
|
131
|
+
descriptor.set.call(this, val);
|
|
132
|
+
}
|
|
133
|
+
},
|
|
134
|
+
configurable: true
|
|
135
|
+
});
|
|
136
|
+
}
|
|
@@ -1,92 +1,149 @@
|
|
|
1
|
-
// ─── Hash codec (URL fragment as namespaced state) ─────────
|
|
2
|
-
//
|
|
3
|
-
// Grammar: #nsA:valA&nsB:valB
|
|
4
|
-
// Each component owns ONE namespace, ignores all others, and PRESERVES
|
|
5
|
-
// foreign segments on write — this is what makes component isolation work.
|
|
6
|
-
//
|
|
7
|
-
// Three-state value model:
|
|
8
|
-
// absent → hashGet returns null (e.g. closed)
|
|
9
|
-
// #ns → hashGet returns '' (present, no value — e.g. "new")
|
|
10
|
-
// #ns:val → hashGet returns 'val' (present, with param)
|
|
11
|
-
//
|
|
12
|
-
// Write mechanism: `location.hash =` (fires hashchange; identical value is a
|
|
13
|
-
// no-op so there are no loops). Never pushState here.
|
|
14
|
-
|
|
15
|
-
function _strip(str) {
|
|
16
|
-
return (str || '').replace(/^#/, '');
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function hashParse(str) {
|
|
20
|
-
const raw = (str === undefined) ? location.hash : str;
|
|
21
|
-
const map = {};
|
|
22
|
-
const h = _strip(raw);
|
|
23
|
-
if (!h) return map;
|
|
24
|
-
const parts = h.split('&');
|
|
25
|
-
for (let i = 0; i < parts.length; i++) {
|
|
26
|
-
const part = parts[i];
|
|
27
|
-
if (!part) continue;
|
|
28
|
-
const sep = part.indexOf(':');
|
|
29
|
-
const ns = (sep > -1 ? part.slice(0, sep) : part);
|
|
30
|
-
const val = (sep > -1 ? part.slice(sep + 1) : '');
|
|
31
|
-
if (!ns) continue;
|
|
32
|
-
try { map[ns] = decodeURIComponent(val); }
|
|
33
|
-
catch (e) { map[ns] = val; }
|
|
34
|
-
}
|
|
35
|
-
return map;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export function hashGet(ns) {
|
|
39
|
-
if (!ns) return null;
|
|
40
|
-
const map = hashParse();
|
|
41
|
-
return (ns in map) ? map[ns] : null;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export function hashSet(ns, value) {
|
|
45
|
-
if (!ns) return;
|
|
46
|
-
const map = hashParse();
|
|
47
|
-
if (value === null || value === undefined) {
|
|
48
|
-
delete map[ns];
|
|
49
|
-
} else {
|
|
50
|
-
map[ns] = String(value);
|
|
51
|
-
}
|
|
52
|
-
const keys = Object.keys(map);
|
|
53
|
-
const next = keys.map(function (k) {
|
|
54
|
-
const v = map[k];
|
|
55
|
-
return (v === '') ? k : (k + ':' + encodeURIComponent(v));
|
|
56
|
-
}).join('&');
|
|
57
|
-
// Setting an identical hash is a no-op (no hashchange) → no loops.
|
|
58
|
-
if (_strip(location.hash) === next) return;
|
|
59
|
-
location.hash = next;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// ─── Hash-link click guard (shared by ln-tabs & ln-modal) ──
|
|
63
|
-
//
|
|
64
|
-
// A "hash link" is an <a href="#…"> whose click a component wants to drive
|
|
65
|
-
// through the codec instead of native fragment navigation (native nav replaces
|
|
66
|
-
// the WHOLE fragment and wipes foreign segments). Both ln-tabs and ln-modal
|
|
67
|
-
// funnel their own anchor clicks through here so the guard + preventDefault
|
|
68
|
-
// live in ONE place.
|
|
69
|
-
//
|
|
70
|
-
// Returns:
|
|
71
|
-
// false → modifier / middle / shift-click: caller must return and let the
|
|
72
|
-
// browser do native open-in-new-tab / new-window. No preventDefault.
|
|
73
|
-
// true → ordinary click: preventDefault() has been called; caller proceeds
|
|
74
|
-
// with its OWN write (hashSet merge, or a component-specific branch
|
|
75
|
-
// such as ln-tabs' already-current setAttribute).
|
|
76
|
-
//
|
|
77
|
-
// Deliberately does NOT call hashSet — ln-tabs needs an "already-current value
|
|
78
|
-
// → setAttribute active directly (no hash write)" branch, so the write differs
|
|
79
|
-
// per component. The shared, reusable surface is the guard + preventDefault.
|
|
80
|
-
export function hashLinkClick(e) {
|
|
81
|
-
if (e.button === 1 || e.ctrlKey || e.metaKey || e.shiftKey) return false;
|
|
82
|
-
e.preventDefault();
|
|
83
|
-
return true;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
1
|
+
// ─── Hash codec (URL fragment as namespaced state) ─────────
|
|
2
|
+
//
|
|
3
|
+
// Grammar: #nsA:valA&nsB:valB
|
|
4
|
+
// Each component owns ONE namespace, ignores all others, and PRESERVES
|
|
5
|
+
// foreign segments on write — this is what makes component isolation work.
|
|
6
|
+
//
|
|
7
|
+
// Three-state value model:
|
|
8
|
+
// absent → hashGet returns null (e.g. closed)
|
|
9
|
+
// #ns → hashGet returns '' (present, no value — e.g. "new")
|
|
10
|
+
// #ns:val → hashGet returns 'val' (present, with param)
|
|
11
|
+
//
|
|
12
|
+
// Write mechanism: `location.hash =` (fires hashchange; identical value is a
|
|
13
|
+
// no-op so there are no loops). Never pushState here.
|
|
14
|
+
|
|
15
|
+
function _strip(str) {
|
|
16
|
+
return (str || '').replace(/^#/, '');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function hashParse(str) {
|
|
20
|
+
const raw = (str === undefined) ? location.hash : str;
|
|
21
|
+
const map = {};
|
|
22
|
+
const h = _strip(raw);
|
|
23
|
+
if (!h) return map;
|
|
24
|
+
const parts = h.split('&');
|
|
25
|
+
for (let i = 0; i < parts.length; i++) {
|
|
26
|
+
const part = parts[i];
|
|
27
|
+
if (!part) continue;
|
|
28
|
+
const sep = part.indexOf(':');
|
|
29
|
+
const ns = (sep > -1 ? part.slice(0, sep) : part);
|
|
30
|
+
const val = (sep > -1 ? part.slice(sep + 1) : '');
|
|
31
|
+
if (!ns) continue;
|
|
32
|
+
try { map[ns] = decodeURIComponent(val); }
|
|
33
|
+
catch (e) { map[ns] = val; }
|
|
34
|
+
}
|
|
35
|
+
return map;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function hashGet(ns) {
|
|
39
|
+
if (!ns) return null;
|
|
40
|
+
const map = hashParse();
|
|
41
|
+
return (ns in map) ? map[ns] : null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function hashSet(ns, value) {
|
|
45
|
+
if (!ns) return;
|
|
46
|
+
const map = hashParse();
|
|
47
|
+
if (value === null || value === undefined) {
|
|
48
|
+
delete map[ns];
|
|
49
|
+
} else {
|
|
50
|
+
map[ns] = String(value);
|
|
51
|
+
}
|
|
52
|
+
const keys = Object.keys(map);
|
|
53
|
+
const next = keys.map(function (k) {
|
|
54
|
+
const v = map[k];
|
|
55
|
+
return (v === '') ? k : (k + ':' + encodeURIComponent(v));
|
|
56
|
+
}).join('&');
|
|
57
|
+
// Setting an identical hash is a no-op (no hashchange) → no loops.
|
|
58
|
+
if (_strip(location.hash) === next) return;
|
|
59
|
+
location.hash = next;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// ─── Hash-link click guard (shared by ln-tabs & ln-modal) ──
|
|
63
|
+
//
|
|
64
|
+
// A "hash link" is an <a href="#…"> whose click a component wants to drive
|
|
65
|
+
// through the codec instead of native fragment navigation (native nav replaces
|
|
66
|
+
// the WHOLE fragment and wipes foreign segments). Both ln-tabs and ln-modal
|
|
67
|
+
// funnel their own anchor clicks through here so the guard + preventDefault
|
|
68
|
+
// live in ONE place.
|
|
69
|
+
//
|
|
70
|
+
// Returns:
|
|
71
|
+
// false → modifier / middle / shift-click: caller must return and let the
|
|
72
|
+
// browser do native open-in-new-tab / new-window. No preventDefault.
|
|
73
|
+
// true → ordinary click: preventDefault() has been called; caller proceeds
|
|
74
|
+
// with its OWN write (hashSet merge, or a component-specific branch
|
|
75
|
+
// such as ln-tabs' already-current setAttribute).
|
|
76
|
+
//
|
|
77
|
+
// Deliberately does NOT call hashSet — ln-tabs needs an "already-current value
|
|
78
|
+
// → setAttribute active directly (no hash write)" branch, so the write differs
|
|
79
|
+
// per component. The shared, reusable surface is the guard + preventDefault.
|
|
80
|
+
export function hashLinkClick(e) {
|
|
81
|
+
if (e.button === 1 || e.ctrlKey || e.metaKey || e.shiftKey) return false;
|
|
82
|
+
e.preventDefault();
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// ─── Hash Helpers for Controls (ln-sort, ln-search, ln-filter) ──
|
|
87
|
+
|
|
88
|
+
export function resolveHashNamespace(el, defaultSuffix) {
|
|
89
|
+
if (!el || !el.hasAttribute('data-ln-hash')) return null;
|
|
90
|
+
const explicit = el.getAttribute('data-ln-hash');
|
|
91
|
+
if (explicit && explicit.trim() !== '') return explicit.trim();
|
|
92
|
+
const targetId = el.getAttribute('data-ln-sort')
|
|
93
|
+
|| el.getAttribute('data-ln-search-for')
|
|
94
|
+
|| el.getAttribute('data-ln-search')
|
|
95
|
+
|| el.getAttribute('data-ln-filter')
|
|
96
|
+
|| el.id;
|
|
97
|
+
if (targetId) {
|
|
98
|
+
return defaultSuffix ? (targetId + '-' + defaultSuffix) : targetId;
|
|
99
|
+
}
|
|
100
|
+
return defaultSuffix || null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function hashSortEncode(fieldOrColumn, direction) {
|
|
104
|
+
if (!direction || direction === 'none' || fieldOrColumn === null || fieldOrColumn === undefined) return null;
|
|
105
|
+
return String(fieldOrColumn) + '.' + direction;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function hashSortDecode(val) {
|
|
109
|
+
if (!val || typeof val !== 'string') return null;
|
|
110
|
+
if (val.endsWith('.asc')) {
|
|
111
|
+
return { fieldOrColumn: val.slice(0, -4), direction: 'asc' };
|
|
112
|
+
}
|
|
113
|
+
if (val.endsWith('.desc')) {
|
|
114
|
+
return { fieldOrColumn: val.slice(0, -5), direction: 'desc' };
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function hashFilterEncode(key, values) {
|
|
120
|
+
if (!key || !Array.isArray(values) || values.length === 0) return null;
|
|
121
|
+
return key + ':' + values.map(encodeURIComponent).join(',');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function hashFilterDecode(val) {
|
|
125
|
+
if (!val || typeof val !== 'string') return null;
|
|
126
|
+
const colon = val.indexOf(':');
|
|
127
|
+
if (colon === -1) return null;
|
|
128
|
+
const key = val.slice(0, colon);
|
|
129
|
+
const rawValues = val.slice(colon + 1);
|
|
130
|
+
const values = rawValues ? rawValues.split(',').map(function (v) {
|
|
131
|
+
try { return decodeURIComponent(v); }
|
|
132
|
+
catch (e) { return v; }
|
|
133
|
+
}).filter(Boolean) : [];
|
|
134
|
+
return { key: key, values: values };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (typeof window !== 'undefined') {
|
|
138
|
+
window.lnCore = window.lnCore || {};
|
|
139
|
+
window.lnCore.hashParse = hashParse;
|
|
140
|
+
window.lnCore.hashGet = hashGet;
|
|
141
|
+
window.lnCore.hashSet = hashSet;
|
|
142
|
+
window.lnCore.hashLinkClick = hashLinkClick;
|
|
143
|
+
window.lnCore.resolveHashNamespace = resolveHashNamespace;
|
|
144
|
+
window.lnCore.hashSortEncode = hashSortEncode;
|
|
145
|
+
window.lnCore.hashSortDecode = hashSortDecode;
|
|
146
|
+
window.lnCore.hashFilterEncode = hashFilterEncode;
|
|
147
|
+
window.lnCore.hashFilterDecode = hashFilterDecode;
|
|
148
|
+
}
|
|
149
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// ==========================================================================
|
|
2
|
+
// ln-core — Shared Helpers & Runtime Kernel Facade (Barrel File)
|
|
3
|
+
// ==========================================================================
|
|
4
|
+
// All primitives are modularized into cohesive single-responsibility modules.
|
|
5
|
+
// This barrel re-exports the entire public surface with 100% backward
|
|
6
|
+
// compatibility. Evaluation order preserves module initialization invariants:
|
|
7
|
+
// events.js evaluates first to ensure window.lnCore and console warning
|
|
8
|
+
// interception are established before subsequent modules load.
|
|
9
|
+
// ==========================================================================
|
|
10
|
+
|
|
11
|
+
// Events & Debug
|
|
12
|
+
export { dispatch, dispatchCancelable, requestData, setDebugSink, setPersistSink, hasActiveDebug, isDevMode } from './events.js';
|
|
13
|
+
|
|
14
|
+
// DOM & Target Predicates
|
|
15
|
+
export { guardBody, isVisible, shouldIgnoreClick, isEditableTarget, isTargetDisabled, isUsableTarget, shouldInterceptLink, readValue } from './dom.js';
|
|
16
|
+
|
|
17
|
+
// Form Utilities
|
|
18
|
+
export { resolveFormMethod, serializeForm, populateForm, interceptValueProperty } from './form.js';
|
|
19
|
+
|
|
20
|
+
// HTTP & Data Mappers
|
|
21
|
+
export { buildUrl, getHeaders, parseHeaders, registerDataMapper, getDataMapper } from './http.js';
|
|
22
|
+
|
|
23
|
+
// Locale & i18n
|
|
24
|
+
export { getLocale, ensureLocaleObserver, registerLocaleFallback, getLocaleFallback } from './locale.js';
|
|
25
|
+
|
|
26
|
+
// Templates & DOM Fill
|
|
27
|
+
export { cloneTemplate, cloneTemplateScoped, fill, lnFill, fillTemplate, renderList, buildDict } from './template.js';
|
|
28
|
+
|
|
29
|
+
// Lifecycle & Kernel Registration
|
|
30
|
+
export { findElements, holdInit, releaseInit, pendingCount, queueBoot, observeAttributes, registerComponent } from './lifecycle.js';
|
|
31
|
+
|
|
32
|
+
// Value Comparison Primitives (re-exported from compare.js for backward compatibility)
|
|
33
|
+
export { compareValues, detectValueType } from './compare.js';
|