@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,486 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildDict,
|
|
3
|
+
dispatch,
|
|
4
|
+
ensureLocaleObserver,
|
|
5
|
+
formatDateToISO,
|
|
6
|
+
getLocale,
|
|
7
|
+
getLocaleFallback,
|
|
8
|
+
interceptValueProperty,
|
|
9
|
+
parseDateInput,
|
|
10
|
+
registerComponent,
|
|
11
|
+
registerLocaleFallback
|
|
12
|
+
} from '../../ln-core';
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
formatDateValue,
|
|
16
|
+
KEYWORD_RE,
|
|
17
|
+
parseTypedDate
|
|
18
|
+
} from './date-model.js';
|
|
19
|
+
|
|
20
|
+
(function () {
|
|
21
|
+
const DOM_SELECTOR = 'data-ln-date';
|
|
22
|
+
const DOM_ATTRIBUTE = 'lnDate';
|
|
23
|
+
|
|
24
|
+
if (window[DOM_ATTRIBUTE] !== undefined) return;
|
|
25
|
+
|
|
26
|
+
function _syncAttribute(el) {
|
|
27
|
+
const inst = el[DOM_ATTRIBUTE];
|
|
28
|
+
if (!inst) return;
|
|
29
|
+
if (inst.isTextElement) {
|
|
30
|
+
inst._initTextElement();
|
|
31
|
+
} else if (inst.value) {
|
|
32
|
+
const date = parseDateInput(inst.value);
|
|
33
|
+
if (date) inst._displayFormatted(date);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// ─── Attribute Contract (SSOT) ──────────────────────────
|
|
38
|
+
const ATTRIBUTES = {
|
|
39
|
+
'data-ln-date': { type: 'enum', values: ['short', 'medium', 'long', 'full', 'iso'], fallback: 'medium', effect: _syncAttribute, description: 'Date display style preset or activator' },
|
|
40
|
+
'data-ln-date-format': { type: 'string', effect: _syncAttribute, description: 'Custom Intl.DateTimeFormat pattern or options' },
|
|
41
|
+
'data-ln-date-locale': { type: 'string', effect: _syncAttribute, description: 'BCP 47 language tag override for date formatting' },
|
|
42
|
+
'data-ln-value': { type: 'string', effect: _syncAttribute, description: 'Raw ISO date string or timestamp for non-time elements (td, span)' },
|
|
43
|
+
'data-ln-date-dict': { type: 'marker', description: 'Container for date translation dictionary' },
|
|
44
|
+
'data-ln-date-dict-key': { type: 'string', description: 'Dictionary key for relative time or custom date formatting' },
|
|
45
|
+
'data-ln-date-field': { type: 'string', description: 'Field name mapping for date record binding' },
|
|
46
|
+
'data-ln-date-label': { type: 'string', description: 'Accessible label text for the date input' }
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const _inputValueDesc = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');
|
|
50
|
+
|
|
51
|
+
// ─── Component Helpers ────────────────────────────────────
|
|
52
|
+
|
|
53
|
+
function _notifyChange(self, iso, date) {
|
|
54
|
+
dispatch(self.dom, 'ln-date:change', {
|
|
55
|
+
value: iso,
|
|
56
|
+
formatted: self.dom.value,
|
|
57
|
+
date: date
|
|
58
|
+
});
|
|
59
|
+
self.dom.dispatchEvent(new Event('change', { bubbles: true }));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function _updateState(self, iso, date, formattedText) {
|
|
63
|
+
self._setHiddenRaw(iso);
|
|
64
|
+
_inputValueDesc.set.call(self._picker, iso);
|
|
65
|
+
self._lastISO = iso;
|
|
66
|
+
if (formattedText !== undefined) {
|
|
67
|
+
self._isFormatting = true;
|
|
68
|
+
self.dom.value = formattedText;
|
|
69
|
+
self._isFormatting = false;
|
|
70
|
+
} else if (date) {
|
|
71
|
+
self._displayFormatted(date);
|
|
72
|
+
}
|
|
73
|
+
_notifyChange(self, iso, date);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function _clearState(self) {
|
|
77
|
+
self._setHiddenRaw('');
|
|
78
|
+
_inputValueDesc.set.call(self._picker, '');
|
|
79
|
+
self._isFormatting = true;
|
|
80
|
+
self.dom.value = '';
|
|
81
|
+
self._isFormatting = false;
|
|
82
|
+
self._lastISO = '';
|
|
83
|
+
_notifyChange(self, '', null);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// ─── Component Constructor & Methods ──────────────────────
|
|
87
|
+
|
|
88
|
+
function _component(dom) {
|
|
89
|
+
if (dom[DOM_ATTRIBUTE]) return dom[DOM_ATTRIBUTE];
|
|
90
|
+
dom[DOM_ATTRIBUTE] = this;
|
|
91
|
+
|
|
92
|
+
this.dom = dom;
|
|
93
|
+
const self = this;
|
|
94
|
+
|
|
95
|
+
// Subscribe to global locale changes
|
|
96
|
+
this._onLocaleChange = function () {
|
|
97
|
+
if (self.isTextElement) {
|
|
98
|
+
self._formatTextContent();
|
|
99
|
+
} else if (self.value) {
|
|
100
|
+
const date = parseDateInput(self.value);
|
|
101
|
+
if (date) self._displayFormatted(date);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
ensureLocaleObserver();
|
|
105
|
+
document.addEventListener('ln-core:locale-change', this._onLocaleChange);
|
|
106
|
+
|
|
107
|
+
if (dom.tagName !== 'INPUT') {
|
|
108
|
+
this.isTextElement = true;
|
|
109
|
+
this._initTextElement();
|
|
110
|
+
return this;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
this.isTextElement = false;
|
|
114
|
+
|
|
115
|
+
// Read initial state
|
|
116
|
+
const initialValue = dom.value;
|
|
117
|
+
const name = dom.name;
|
|
118
|
+
|
|
119
|
+
// Check for declarative HTML dictionary nearby
|
|
120
|
+
const container = dom.closest('.form-element, form') || dom.parentNode;
|
|
121
|
+
if (container) {
|
|
122
|
+
const dictEls = container.querySelectorAll('[data-ln-date-dict]');
|
|
123
|
+
for (let i = 0; i < dictEls.length; i++) {
|
|
124
|
+
const lang = dictEls[i].getAttribute('data-ln-date-dict');
|
|
125
|
+
if (lang) {
|
|
126
|
+
const dictData = buildDict(dictEls[i], 'data-ln-date-dict-key');
|
|
127
|
+
if (dictData['months-long']) {
|
|
128
|
+
dictData.monthsLong = dictData['months-long'].split(',').map(s => s.trim());
|
|
129
|
+
}
|
|
130
|
+
if (dictData['months-short']) {
|
|
131
|
+
dictData.monthsShort = dictData['months-short'].split(',').map(s => s.trim());
|
|
132
|
+
}
|
|
133
|
+
registerLocaleFallback(lang, dictData);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Wrap field: <span data-ln-date-field>
|
|
139
|
+
const wrapper = document.createElement('span');
|
|
140
|
+
wrapper.setAttribute('data-ln-date-field', '');
|
|
141
|
+
dom.parentNode.insertBefore(wrapper, dom);
|
|
142
|
+
wrapper.appendChild(dom);
|
|
143
|
+
this._wrapper = wrapper;
|
|
144
|
+
|
|
145
|
+
// Create hidden input for form submission
|
|
146
|
+
const hidden = document.createElement('input');
|
|
147
|
+
hidden.type = 'hidden';
|
|
148
|
+
hidden.name = name;
|
|
149
|
+
dom.removeAttribute('name');
|
|
150
|
+
if (dom.hasAttribute('data-ln-fill-as')) {
|
|
151
|
+
hidden.setAttribute('data-ln-fill-as', dom.getAttribute('data-ln-fill-as'));
|
|
152
|
+
}
|
|
153
|
+
dom.insertAdjacentElement('afterend', hidden);
|
|
154
|
+
this._hidden = hidden;
|
|
155
|
+
|
|
156
|
+
// Create hidden date input for native picker
|
|
157
|
+
const picker = document.createElement('input');
|
|
158
|
+
picker.type = 'date';
|
|
159
|
+
picker.tabIndex = -1;
|
|
160
|
+
picker.setAttribute('tabindex', '-1');
|
|
161
|
+
picker.setAttribute('aria-hidden', 'true');
|
|
162
|
+
picker.setAttribute('aria-label', dom.getAttribute('data-ln-date-label') || 'Date picker');
|
|
163
|
+
picker.style.cssText = 'position:absolute;opacity:0;width:0;height:0;overflow:hidden;pointer-events:none';
|
|
164
|
+
hidden.insertAdjacentElement('afterend', picker);
|
|
165
|
+
this._picker = picker;
|
|
166
|
+
|
|
167
|
+
// Transform visible input to text
|
|
168
|
+
dom.type = 'text';
|
|
169
|
+
|
|
170
|
+
// Create calendar button
|
|
171
|
+
const btn = document.createElement('button');
|
|
172
|
+
btn.type = 'button';
|
|
173
|
+
btn.setAttribute('aria-label', dom.getAttribute('data-ln-date-label') || 'Open date picker');
|
|
174
|
+
btn.innerHTML = '<svg class="ln-icon" aria-hidden="true"><use href="#ln-icon-calendar"></use></svg>';
|
|
175
|
+
picker.insertAdjacentElement('afterend', btn);
|
|
176
|
+
this._btn = btn;
|
|
177
|
+
this._lastISO = '';
|
|
178
|
+
|
|
179
|
+
// Intercept programmatic value sets on hidden input
|
|
180
|
+
Object.defineProperty(hidden, 'value', {
|
|
181
|
+
get: function () {
|
|
182
|
+
return _inputValueDesc.get.call(hidden);
|
|
183
|
+
},
|
|
184
|
+
set: function (val) {
|
|
185
|
+
_inputValueDesc.set.call(hidden, val);
|
|
186
|
+
if (val && val !== '') {
|
|
187
|
+
const date = parseDateInput(val);
|
|
188
|
+
if (date) _updateState(self, val, date);
|
|
189
|
+
} else if (val === '') {
|
|
190
|
+
_clearState(self);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
// Intercept programmatic value sets on visible input (2-way binding)
|
|
196
|
+
interceptValueProperty(dom, _inputValueDesc, {
|
|
197
|
+
get: function () {
|
|
198
|
+
return _inputValueDesc.get.call(dom);
|
|
199
|
+
},
|
|
200
|
+
set: function (val, originalSet) {
|
|
201
|
+
if (self._isFormatting) {
|
|
202
|
+
originalSet(val);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (!val || val === '') {
|
|
206
|
+
originalSet('');
|
|
207
|
+
_clearState(self);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const date = parseDateInput(val) || parseTypedDate(val);
|
|
212
|
+
if (date) {
|
|
213
|
+
const iso = formatDateToISO(date);
|
|
214
|
+
const format = dom.getAttribute(DOM_SELECTOR) || '';
|
|
215
|
+
const locale = getLocale(dom);
|
|
216
|
+
const fallback = getLocaleFallback(locale);
|
|
217
|
+
const formatted = formatDateValue(date, format, locale, fallback);
|
|
218
|
+
originalSet(formatted);
|
|
219
|
+
_updateState(self, iso, date, formatted);
|
|
220
|
+
} else {
|
|
221
|
+
originalSet(String(val));
|
|
222
|
+
_clearState(self);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// Bind events
|
|
228
|
+
this._onPickerChange = function () {
|
|
229
|
+
const val = picker.value;
|
|
230
|
+
if (val) {
|
|
231
|
+
const date = parseDateInput(val);
|
|
232
|
+
if (date) _updateState(self, val, date);
|
|
233
|
+
} else {
|
|
234
|
+
_clearState(self);
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
picker.addEventListener('change', this._onPickerChange);
|
|
238
|
+
|
|
239
|
+
this._onBlur = function () {
|
|
240
|
+
const typed = self.dom.value.trim();
|
|
241
|
+
|
|
242
|
+
if (typed === '') {
|
|
243
|
+
if (self._lastISO !== '') _clearState(self);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (self._lastISO) {
|
|
248
|
+
const currentDate = parseDateInput(self._lastISO);
|
|
249
|
+
if (currentDate) {
|
|
250
|
+
const format = self.dom.getAttribute(DOM_SELECTOR) || '';
|
|
251
|
+
const locale = getLocale(self.dom);
|
|
252
|
+
const fallback = getLocaleFallback(locale);
|
|
253
|
+
if (typed === formatDateValue(currentDate, format, locale, fallback)) return;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const parsed = parseTypedDate(typed);
|
|
258
|
+
if (parsed) {
|
|
259
|
+
const iso = formatDateToISO(parsed);
|
|
260
|
+
_updateState(self, iso, parsed);
|
|
261
|
+
} else {
|
|
262
|
+
if (self._lastISO) {
|
|
263
|
+
const prevDate = parseDateInput(self._lastISO);
|
|
264
|
+
if (prevDate) self._displayFormatted(prevDate);
|
|
265
|
+
} else {
|
|
266
|
+
self.dom.value = '';
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
dom.addEventListener('blur', this._onBlur);
|
|
271
|
+
|
|
272
|
+
this._onBtnClick = function () {
|
|
273
|
+
self._openPicker();
|
|
274
|
+
};
|
|
275
|
+
btn.addEventListener('click', this._onBtnClick);
|
|
276
|
+
|
|
277
|
+
// Handle form reset
|
|
278
|
+
const form = dom.form;
|
|
279
|
+
if (form) {
|
|
280
|
+
this._form = form;
|
|
281
|
+
this._onFormReset = function () {
|
|
282
|
+
setTimeout(function () {
|
|
283
|
+
const val = self.dom.value;
|
|
284
|
+
if (val) {
|
|
285
|
+
const date = parseDateInput(val) || parseTypedDate(val);
|
|
286
|
+
if (date) {
|
|
287
|
+
const iso = formatDateToISO(date);
|
|
288
|
+
_updateState(self, iso, date);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
_clearState(self);
|
|
293
|
+
}, 0);
|
|
294
|
+
};
|
|
295
|
+
form.addEventListener('reset', this._onFormReset);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Handle initial pre-filled value
|
|
299
|
+
if (initialValue && initialValue !== '') {
|
|
300
|
+
const date = parseDateInput(initialValue);
|
|
301
|
+
if (date) _updateState(self, initialValue, date);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
return this;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
_component.prototype._initTextElement = function () {
|
|
308
|
+
const dom = this.dom;
|
|
309
|
+
const valAttr = dom.getAttribute('data-ln-value');
|
|
310
|
+
const dateAttr = dom.getAttribute('data-ln-date');
|
|
311
|
+
const datetimeAttr = dom.getAttribute('datetime');
|
|
312
|
+
|
|
313
|
+
let candidate = null;
|
|
314
|
+
if (dom.tagName === 'TIME' && datetimeAttr !== null && datetimeAttr !== '') {
|
|
315
|
+
candidate = datetimeAttr;
|
|
316
|
+
} else if (valAttr !== null && valAttr !== '') {
|
|
317
|
+
candidate = valAttr;
|
|
318
|
+
} else if (datetimeAttr !== null && datetimeAttr !== '') {
|
|
319
|
+
candidate = datetimeAttr;
|
|
320
|
+
} else if (dateAttr !== null && dateAttr !== '' && dateAttr !== 'true' && !KEYWORD_RE.test(dateAttr)) {
|
|
321
|
+
candidate = dateAttr;
|
|
322
|
+
} else {
|
|
323
|
+
candidate = dom.textContent.trim();
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
const date = parseDateInput(candidate) || parseTypedDate(candidate);
|
|
327
|
+
if (date && !isNaN(date.getTime())) {
|
|
328
|
+
const iso = formatDateToISO(date);
|
|
329
|
+
this._rawValue = iso;
|
|
330
|
+
if (dom.tagName !== 'TIME' && !dom.hasAttribute('data-ln-value')) {
|
|
331
|
+
dom.setAttribute('data-ln-value', iso);
|
|
332
|
+
}
|
|
333
|
+
this._formatTextContent();
|
|
334
|
+
} else {
|
|
335
|
+
this._rawValue = null;
|
|
336
|
+
}
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
_component.prototype._formatTextContent = function () {
|
|
340
|
+
if (this._rawValue) {
|
|
341
|
+
const date = parseDateInput(this._rawValue);
|
|
342
|
+
if (date) {
|
|
343
|
+
const formatAttr = this.dom.getAttribute('data-ln-date-format');
|
|
344
|
+
let format = formatAttr;
|
|
345
|
+
if (!format) {
|
|
346
|
+
const dateAttr = this.dom.getAttribute('data-ln-date');
|
|
347
|
+
if (dateAttr && KEYWORD_RE.test(dateAttr)) {
|
|
348
|
+
format = dateAttr;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
const locale = getLocale(this.dom);
|
|
352
|
+
const fallback = getLocaleFallback(locale);
|
|
353
|
+
this.dom.textContent = formatDateValue(date, format || 'medium', locale, fallback);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
|
|
358
|
+
_component.prototype._openPicker = function () {
|
|
359
|
+
if (typeof this._picker.showPicker === 'function') {
|
|
360
|
+
try {
|
|
361
|
+
this._picker.showPicker();
|
|
362
|
+
} catch (e) {
|
|
363
|
+
this._picker.click();
|
|
364
|
+
}
|
|
365
|
+
} else {
|
|
366
|
+
this._picker.click();
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
_component.prototype._setHiddenRaw = function (val) {
|
|
371
|
+
_inputValueDesc.set.call(this._hidden, val);
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
_component.prototype._displayFormatted = function (date) {
|
|
375
|
+
const format = this.dom.getAttribute(DOM_SELECTOR) || '';
|
|
376
|
+
const locale = getLocale(this.dom);
|
|
377
|
+
const fallback = getLocaleFallback(locale);
|
|
378
|
+
this._isFormatting = true;
|
|
379
|
+
this.dom.value = formatDateValue(date, format, locale, fallback);
|
|
380
|
+
this._isFormatting = false;
|
|
381
|
+
};
|
|
382
|
+
|
|
383
|
+
// ─── Public API ───────────────────────────────────────────
|
|
384
|
+
|
|
385
|
+
Object.defineProperty(_component.prototype, 'value', {
|
|
386
|
+
get: function () {
|
|
387
|
+
if (this.isTextElement) {
|
|
388
|
+
return this._rawValue || '';
|
|
389
|
+
}
|
|
390
|
+
return _inputValueDesc.get.call(this._hidden);
|
|
391
|
+
},
|
|
392
|
+
set: function (isoStr) {
|
|
393
|
+
if (this.isTextElement) {
|
|
394
|
+
if (!isoStr || isoStr === '') {
|
|
395
|
+
this._rawValue = null;
|
|
396
|
+
this.dom.removeAttribute('data-ln-value');
|
|
397
|
+
if (this.dom.tagName === 'TIME') {
|
|
398
|
+
this.dom.removeAttribute('datetime');
|
|
399
|
+
}
|
|
400
|
+
this.dom.textContent = '';
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
const date = parseDateInput(isoStr) || parseTypedDate(isoStr);
|
|
404
|
+
if (!date) return;
|
|
405
|
+
const iso = formatDateToISO(date);
|
|
406
|
+
this._rawValue = iso;
|
|
407
|
+
if (this.dom.tagName === 'TIME') {
|
|
408
|
+
this.dom.setAttribute('datetime', iso);
|
|
409
|
+
} else {
|
|
410
|
+
this.dom.setAttribute('data-ln-value', iso);
|
|
411
|
+
}
|
|
412
|
+
this._formatTextContent();
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
if (!isoStr || isoStr === '') {
|
|
416
|
+
_clearState(this);
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
const date = parseDateInput(isoStr);
|
|
420
|
+
if (!date) return;
|
|
421
|
+
_updateState(this, isoStr, date);
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
Object.defineProperty(_component.prototype, 'date', {
|
|
426
|
+
get: function () {
|
|
427
|
+
const val = this.value;
|
|
428
|
+
if (!val) return null;
|
|
429
|
+
return parseDateInput(val);
|
|
430
|
+
},
|
|
431
|
+
set: function (dateObj) {
|
|
432
|
+
if (!dateObj || !(dateObj instanceof Date) || isNaN(dateObj.getTime())) {
|
|
433
|
+
this.value = '';
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
this.value = formatDateToISO(dateObj);
|
|
437
|
+
}
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
Object.defineProperty(_component.prototype, 'formatted', {
|
|
441
|
+
get: function () {
|
|
442
|
+
if (this.isTextElement) {
|
|
443
|
+
return this.dom.textContent;
|
|
444
|
+
}
|
|
445
|
+
return this.dom.value;
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
_component.prototype.destroy = function () {
|
|
450
|
+
if (!this.dom[DOM_ATTRIBUTE]) return;
|
|
451
|
+
if (this.isTextElement) {
|
|
452
|
+
delete this.dom[DOM_ATTRIBUTE];
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
455
|
+
if (this._form && this._onFormReset) {
|
|
456
|
+
this._form.removeEventListener('reset', this._onFormReset);
|
|
457
|
+
}
|
|
458
|
+
this._picker.removeEventListener('change', this._onPickerChange);
|
|
459
|
+
this.dom.removeEventListener('blur', this._onBlur);
|
|
460
|
+
this._btn.removeEventListener('click', this._onBtnClick);
|
|
461
|
+
const isoVal = this.value;
|
|
462
|
+
this._hidden.remove();
|
|
463
|
+
this._picker.remove();
|
|
464
|
+
this._btn.remove();
|
|
465
|
+
if (this._wrapper && this._wrapper.parentNode) {
|
|
466
|
+
this._wrapper.parentNode.insertBefore(this.dom, this._wrapper);
|
|
467
|
+
this._wrapper.remove();
|
|
468
|
+
}
|
|
469
|
+
delete this.dom.value;
|
|
470
|
+
this.dom.name = this._hidden.name;
|
|
471
|
+
this.dom.type = 'date';
|
|
472
|
+
if (isoVal) this.dom.value = isoVal;
|
|
473
|
+
if (this._onLocaleChange) {
|
|
474
|
+
document.removeEventListener('ln-core:locale-change', this._onLocaleChange);
|
|
475
|
+
}
|
|
476
|
+
delete this.dom[DOM_ATTRIBUTE];
|
|
477
|
+
};
|
|
478
|
+
|
|
479
|
+
// ─── Init ─────────────────────────────────────────────────
|
|
480
|
+
|
|
481
|
+
registerComponent(DOM_SELECTOR, DOM_ATTRIBUTE, _component, 'ln-date', {
|
|
482
|
+
attributes: ATTRIBUTES,
|
|
483
|
+
extraAttributes: ['datetime', 'lang'],
|
|
484
|
+
onAttributeChange: _syncAttribute
|
|
485
|
+
});
|
|
486
|
+
})();
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# ln-debug
|
|
2
|
+
|
|
3
|
+
> Activated via the `data-ln-debug` attribute on `<body>` (or an element inside `<body>`). It gates library console warnings (`[ln-`), listens to DOM mutations and `ln-*` CustomEvents, verifies cross-references (`data-ln-*-for`, `data-ln-*-source`), and flags misspelled library attributes against the schema manifest using Levenshtein distance. It introduces zero production overhead, remaining dormant or excluded outside development mode without modifying DOM structure.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Philosophy & Purpose
|
|
8
|
+
|
|
9
|
+
In production, libraries should remain completely silent and zero-overhead. In development, however, missing templates, broken target IDs (`data-ln-toggle-for`), unresolved data stores (`data-ln-table-source`), and attribute spelling typos (`data-ln-tabl-source`) lead to silent failures and wasted debugging time.
|
|
10
|
+
|
|
11
|
+
The `ln-debug` component solves this by providing:
|
|
12
|
+
1. **Console Warning Filter**: Gates library warnings (`[ln-` / `[lnCore`) so they only print when debug mode is enabled.
|
|
13
|
+
2. **Generic Cross-Reference Contract Verifier**:
|
|
14
|
+
- Validates that `data-ln-*-for` target IDs resolve to existing DOM elements.
|
|
15
|
+
- Validates that `data-ln-*-source` and `data-ln-*-store` consumers resolve to declared `[data-ln-data-store]` providers.
|
|
16
|
+
- Flags duplicate `[data-ln-data-store]` instances across the document.
|
|
17
|
+
- Detects misspelled `data-ln-*` attributes against the schema-generated attribute manifest.
|
|
18
|
+
3. **Console Observation Layer**: Logs every `ln-*` CustomEvent dispatched through `ln-core`, and every library attribute mutation, to the console — the library's whole runtime life, visible on demand.
|
|
19
|
+
4. **Zero Production Overhead**: Runs strictly in dev mode (`data-ln-debug` attribute or `dist/ln-ashlar-dev.js`).
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 2. Minimal Blueprint
|
|
24
|
+
|
|
25
|
+
Add the `data-ln-debug` attribute to `<body>`, or to any element whose
|
|
26
|
+
subtree should be observed:
|
|
27
|
+
|
|
28
|
+
```html
|
|
29
|
+
<!DOCTYPE html>
|
|
30
|
+
<html lang="en">
|
|
31
|
+
<head>
|
|
32
|
+
<!-- Core library and Dev Verifier -->
|
|
33
|
+
<script src="dist/ln-ashlar.iife.js" defer></script>
|
|
34
|
+
</head>
|
|
35
|
+
<body data-ln-debug>
|
|
36
|
+
<!-- Broken references or typos will be reported clearly in the console -->
|
|
37
|
+
<button data-ln-toggle-for="sidebar-menu">Toggle</button>
|
|
38
|
+
<div id="sidebar-menu">Sidebar Content</div>
|
|
39
|
+
</body>
|
|
40
|
+
</html>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The console warning filter (§1), the cross-reference verifier (§3), and
|
|
44
|
+
the console observation layer (§6) activate on elements inside `<body>`'s
|
|
45
|
+
subtree — see §6 for the observation layer's host-containment rule.
|
|
46
|
+
Placing `data-ln-debug` on `<html>` is unsupported and ignored.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 3. Generic Resolvers & Diagnostic Rules
|
|
51
|
+
|
|
52
|
+
| Rule | Pattern | Description | Example Warning |
|
|
53
|
+
|---|---|---|---|
|
|
54
|
+
| **ID References** | `data-ln-*-for="id"` | Verifies target `#id` exists in the document | `[ln-debug] Unresolved ID reference: <button data-ln-toggle-for="menu"> targets "#menu", but no element with id="menu" exists in the document.` |
|
|
55
|
+
| **Store References** | `data-ln-*-source="store"` | Verifies `[data-ln-data-store="store"]` exists in the DOM | `[ln-debug] Unresolved store reference: <table data-ln-table-source="users"> targets store "users", but no [data-ln-data-store="users"] exists in the document.` |
|
|
56
|
+
| **Store Uniqueness** | `[data-ln-data-store]` | Ensures store names are globally unique | `[ln-debug] Duplicate store name: Multiple elements declare data-ln-data-store="users". Store names must be unique across the document.` |
|
|
57
|
+
| **Attribute Spelling** | `data-ln-*` | Checks against generated attribute manifest and suggests typos | `[ln-debug] Unknown attribute "data-ln-table-sorce" on <table>. Did you mean "data-ln-table-source"?` |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 4. Programmatic API
|
|
62
|
+
|
|
63
|
+
When debug mode is loaded, `window.lnDebug` is available for on-demand verification and testing:
|
|
64
|
+
|
|
65
|
+
```javascript
|
|
66
|
+
// Perform a synchronous scan of the document (or a specific subtree)
|
|
67
|
+
const report = window.lnDebug.verify(document.body, { silent: false });
|
|
68
|
+
|
|
69
|
+
console.log(`Found ${report.total} issue(s):`);
|
|
70
|
+
console.log(report.idIssues);
|
|
71
|
+
console.log(report.storeIssues);
|
|
72
|
+
console.log(report.uniquenessIssues);
|
|
73
|
+
console.log(report.spellingIssues);
|
|
74
|
+
|
|
75
|
+
// Schedule a debounced verification that waits for lifecycle boot queue to settle
|
|
76
|
+
window.lnDebug.schedule(document.body, 50, (report) => {
|
|
77
|
+
console.log('DOM verification completed:', report);
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 5. Lifecycle Coordination & False-Alarm Prevention
|
|
84
|
+
|
|
85
|
+
The verifier hooks into `lnCore`'s `queueBoot` and `pendingCount()`:
|
|
86
|
+
- If asynchronous initialization is in progress (`holdInit` > 0 from `ln-include` or router), verification is queued and executes only after boot holds are released.
|
|
87
|
+
- Rapid DOM mutations are debounced to ensure sibling elements (e.g. stores and consumers) have fully settled before invariants are asserted.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 6. Console Observation Layer
|
|
92
|
+
|
|
93
|
+
While a host is active, `ln-core`'s `dispatch()`, `dispatchCancelable()`, and
|
|
94
|
+
`lnFill()` log every `ln-*` CustomEvent they emit — event name, target
|
|
95
|
+
element, and detail payload — to the console via `console.groupCollapsed`.
|
|
96
|
+
The shared attribute observer likewise logs every mutation of a
|
|
97
|
+
`data-ln-*` attribute, and of any attribute the library's reactive
|
|
98
|
+
registry already observes (`lang`, `href`, `datetime`), as an `old →
|
|
99
|
+
new` pair. Page attributes the library has no opinion on (`class`,
|
|
100
|
+
`style`, `aria-*`) are never logged — this is the library's runtime life,
|
|
101
|
+
not the page's.
|
|
102
|
+
|
|
103
|
+
**Host containment.** A host is any element carrying `data-ln-debug`.
|
|
104
|
+
Multiple hosts may be active at once. An event or attribute mutation is
|
|
105
|
+
logged only when some active host `.contains()` the target element — this
|
|
106
|
+
layer observes its own subtree, exactly like every other component in the
|
|
107
|
+
library. Placing `data-ln-debug` on `<body>` observes the whole page;
|
|
108
|
+
placing it on a smaller container scopes logging to that container's
|
|
109
|
+
descendants only.
|
|
110
|
+
|
|
111
|
+
**Page-wide exception.** A handful of `dispatch()` calls target `window` or
|
|
112
|
+
`document` directly — `ln-toast:enqueue`, `ln-data-store:online` /
|
|
113
|
+
`offline` / `quota-exceeded`, `ln-core:locale-change` — because no element
|
|
114
|
+
subtree can contain a target that isn't an element. These log only when
|
|
115
|
+
`document.body` itself is a host.
|
|
116
|
+
|
|
117
|
+
**Scope.** `data-ln-debug` is read from elements inside `document.body`'s
|
|
118
|
+
subtree via the shared attribute observer, and is re-evaluated on every
|
|
119
|
+
mutation of that attribute — adding or removing it on any descendant of
|
|
120
|
+
`<body>` (including `<body>` itself) takes effect immediately, without a
|
|
121
|
+
reload, whether added, removed, or toggled in the DOM inspector. An element
|
|
122
|
+
that already carries `data-ln-debug` at the moment it is inserted into the
|
|
123
|
+
document — via `innerHTML`, `appendChild`, `ln-include`, or a router view
|
|
124
|
+
swap — becomes an active host immediately on insertion, and stops being one
|
|
125
|
+
the moment it is removed. `<html>` is not a supported host for this layer —
|
|
126
|
+
unlike the console warning filter in §1, which still reads `data-ln-debug`
|
|
127
|
+
from `<html>` or `<body>`. The two checks are independent and are not
|
|
128
|
+
required to agree.
|
|
129
|
+
|
|
130
|
+
Nothing is logged via `console.warn` or `console.debug` — `console.warn`
|
|
131
|
+
is reserved for markup-error diagnostics (see above), and Chrome hides
|
|
132
|
+
`console.debug` below its Verbose log level by default.
|